1

我对 MongoDB 本机 JS 驱动程序和给定唯一约束的插入有点困惑。在这里阅读http://mongodb.github.com/node-mongodb-native/api-articles/nodekoarticle1.html,似乎在插入之后,可以传递一个“成功”回调来处理保存的文档(也许例如,从保存的文档中获取 _id 字段)。

但是,假设我正在保存用户配置文件,每个配置文件都有一个电子邮件字段。我希望电子邮件字段是唯一的,所以我认为我必须使用 ensureIndex。然后假设我想批量插入 10 个用户配置文件,每个配置文件都有一个电子邮件字段,但是这 10 封电子邮件中有 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);                                                         
});

导致上面的回调返回未定义,因为包含该电子邮件的文档已经存在,因此没有执行插入。这很有意义,但我希望“结果”返回包含已经存在的文档,从而阻止新的插入。那可能吗?

4

1 回答 1

-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")

于 2012-10-11T19:07:10.827 回答