主要目标是:一次插入多个文档,但确保只有唯一的文档存储在集合中说明
我正在同时将许多文档插入到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" : [ ]
})
还有另一种方法吗?
答案 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},{独特:真})