Node.js 唯一索引不是唯一的
为了测试的目的,我试图在MongoDB上的唯一索引上创建并尝试编写一个副本。我的代码基本上是:Node.js 唯一索引不是唯一的,node.js,mongodb,node-mongodb-native,Node.js,Mongodb,Node Mongodb Native,为了测试的目的,我试图在MongoDB上的唯一索引上创建并尝试编写一个副本。我的代码基本上是: db.collection("foo").ensureIndex({a: 1}, {unique: true}, function () { db.collection("foo").insert({a: "foo"}, function () { db.collection("foo").insert({a: "foo"}); }); }); 然而,这并没有以任何方
db.collection("foo").ensureIndex({a: 1}, {unique: true}, function () {
db.collection("foo").insert({a: "foo"}, function () {
db.collection("foo").insert({a: "foo"});
});
});
然而,这并没有以任何方式失败。如果我连接到我的数据库并运行DB.foo.find({a:“foo”})
我将在运行之后找到两个结果。这表示{unique:true}
工作不正常/没有做任何事情/etc
使用createIndex
也不起作用
我是否错误地使用了MongoDB唯一索引?在我尝试使用mongo之后,恐怕代码很有用。确保索引后记录将是唯一的。您可以检查mongo版本或在回调中设置err以查找任何语法错误。您创建的索引正确,但没有正确响应数据库发送的潜在错误 在使用NodeJS时,需要检查回调的第一个参数以检查错误(大多数带有回调的NodeJS API都遵循此模式,MongoDB NodeJS本机驱动程序也是如此):
您应该检查回调中的
err
(即first)参数,以帮助诊断问题。我无法在运行完全相同的代码(用connect包装)的情况下复制此参数。它会像预期的那样出错,结果在数据库中留下1个文档。这很好,但主要问题是,即使产生了错误,仍然会插入重复条目。是否显示了任何错误?我只是按原样运行代码,唯一的错误是:MongoError:E11000重复键错误索引:test123.foo。$a_1 dup-key:{:“foo”}
您可以尝试将background:false
添加到选项中。如果已经存在重复项,则需要清除集合或添加:{dropDups:true}
强制修复数据()。如果存在重复项,则不会创建索引。
db.collection("foo").ensureIndex({a: 1}, {unique: true}, function (err) {
if(err) { console.log('failed to create index: ', err); return; }
db.collection("foo").insert({a: "foo"}, function (err) {
if(err) { console.log('first insert failed: ', err); return; }
db.collection("foo").insert({a: "foo"}, function (err) {
if(err) {
console.log('insert failed:', err);
return;
}
});
});
});