我对MongoDB本机JS驱动程序有点困惑,并且插入了给定的唯一约束。在这里阅读http://mongodb.github.com/node-mongodb-native/api-articles/nodekoarticle1.html,看来插入后,成功"可以传递可以处理已保存文档的回调(例如,可能从保存的文档中获取_id字段)。
但是,假设我正在保存用户配置文件,每个配置文件都有一个电子邮件字段。我希望电子邮件字段是唯一的,所以我想我必须使用ensureIndex。然后假设我想批量插入10个用户配置文件,每个配置文件都带有一个电子邮件字段,但这10封电子邮件中有2封已存在于我的数据库中。那么通过唯一约束,这2个用户配置文件不会被添加到数据库中,对吧?然后在回调中又回来了什么? 8个保存的文件?或8个保存的文件和2个预先存在的文件?
编辑: 经过一番测试后,我取得了一些进步,但我仍然缺少一件。我将从上面继续解释我的例子。假设我有一组用户配置文件,其中包含1个文档,该文档的字段包含" email":" ex@mple.com"。然后假设我在此集合的电子邮件字段中放置了一个带有{unique:true}的索引。如果我然后执行一个简单的插入:
collection.insert({ 'email': 'ex@mple.com' }, { safe: true }, function (err, results) {
console.log(results);
});
导致上面的回调返回未定义,因为已存在具有该电子邮件的文档,因此未执行插入。这很有道理,但我想要的是"结果"回来包含已经存在的文件,这阻止了新的插入。这可能吗?
答案 0 :(得分:-1)
> db.collection.find()
{ "_id" : 1, email : "email" }
> db.collection.ensureIndex({email: 1}, {unique: true})
> db.collection.insert({_id:2, email: "email"})
E11000 duplicate key error index: foo.collection.$email_1 dup key: { : "email" }
您是否可以解析重复的密钥错误消息“E11000重复密钥...”以获取“电子邮件”,然后发出find()以获取阻止插入的预先存在的文档?
因为只有一个文件-db.collection.find(email:“email”)