集合插入多个 - 确保唯一性

时间:2016-10-08 16:56:33

标签: javascript node.js mongodb mongodb-query

主要目标是:一次插入多个文档,但确保只有唯一的文档存储在集合中说明

我正在同时将许多文档插入到mongodb集合中:

db.users.insert([{name: 'Joe'}{'name': 'Bob'}]);

进入插入的一些值可能是重复的,我希望MongoDB忽略这些。这是为了确保集合中的唯一性。

db.users.insert([{name: 'Joe'}{'name': 'Jack'}]);

如果整个插入不是唯一的,而不是仅忽略非唯一项,则使用索引整个.insert()操作将失败。

db.users.createIndex({ 'name': 1 }, { unique: true });

从mongoDB登录:

BulkWriteResult({
    "writeErrors" : [
        {
            "index" : 0,
            "code" : 11000,
            "errmsg" : "E11000 duplicate key error collection: test.users index: name_1 dup key: { : \"Joe\" }",
            "op" : {
                "_id" : ObjectId("57f924ee7d864acfefaca700"),
                "name" : "joe"
            }
        }
    ],
    "writeConcernErrors" : [ ],
    "nInserted" : 0,
    "nUpserted" : 0,
    "nMatched" : 0,
    "nModified" : 0,
    "nRemoved" : 0,
    "upserted" : [ ]
})

还有另一种方法吗?

3 个答案:

答案 0 :(得分:0)

忘记评论。也许你正在寻找类似这样的东西。 UnorderedBulkOp

魔术来自于无序批量操作并行发生。如果其中一个(或一些)fai,MongoDB继续其余的并在结束时喊出错误。

答案 1 :(得分:0)

寻找答案的人。我最终使用批量update.upsert()操作。这意味着我可以保留我的上限系列,确保它是订购的,并且整个操作仍然是批量的。

这消除了对唯一索引的需求,因为upsert始终更新/插入数据,确保我们不会重复。 查找操作应包括唯一键。

const bulk = db.collection.initializeOrderedBulkOp();
bulk.find({name: 'Joe'}).upsert().updateOne({name: 'Joe'});
bulk.find({name: 'Bob'}).upsert().updateOne({name: 'Bob'});
bulk.find({name: 'Jack'}).upsert().updateOne({name: 'Jack'});
bulk.execute();

答案 2 :(得分:0)

要使用某个唯一键插入多个文档,您可以创建一个索引,您可以在其中声明该键是唯一的。 与您的情况类似,您可以使用此命令

创建索引

db.users.createIndex({ “名称”:1},{独特:真})