2012-09-25 100 views
0

我对MongoDB原生JS驱动程序有点困惑,并给出了独特的约束条件。在这里阅读http://mongodb.github.com/node-mongodb-native/api-articles/nodekoarticle1.html,看起来在插入之后,可以传递一个“成功”回调来处理保存的文档(例如,可以从保存的文档中获取_id字段)。MongoDB Javascript批量插入唯一约束

但是,假设我保存了用户配置文件,每个配置文件都有一个电子邮件字段。我希望电子邮件字段是唯一的,所以我想我必须使用ensureIndex。然后假设我想批量插入10个用户配置文件,每个用户配置文件都有一个电子邮件字段,但这10个电子邮件中的2个已经存在于我的数据库中。那么通过这个独特的限制,这两个用户配置文件将不会被添加到数据库中,对吗?那么回调是什么回来? 8个保存的文件?或8个保存的文件和2个预先存在的文件?

编辑: 经过一些测试,我取得了一些很好的进展,但我仍然失去了一块。我会解释从上面继续我的例子。假设我有一个包含1个文档的用户配置文件集合,并且该文档有一个“email”字段:“[email protected]”。然后,假设我在此集合的电子邮件字段中放置了一个带有{unique:true}的索引。如果我再执行一个简单的插入:

collection.insert({ 'email': '[email protected]' }, { safe: true }, function (err, results) { 
    console.log(results);               
}); 

导致回调上述回来不确定,因为与电子邮件的文件已经存在,所以没有进行插入。这很有道理,但我想要的是“结果”返回包含已存在的文档,这阻止了新的插入。那可能吗?

回答

0
> 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”)