使用唯一索引进行MongoDB批量插入

7
假设我有一个要插入的文档列表。
这些文档具有如下结构:
{
  url: string,
  visited: boolean
}

我在"url"键上有一个唯一索引。
当我插入文档时,如果发现1个重复项,则整个操作将被中止。
有没有办法仍然使用批量插入,并且它将插入所有不是重复的文档?
作为解决方法,我必须逐个插入文档,我担心插入的开销会对性能产生影响。
2个回答

4
假设我有一个集合,在字段名为 a 的字段上有唯一索引,如 .getIndexes() 的输出所示。
> db.collection.getIndexes()
[
        {
                "v" : 1,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "test.collection"
        },
        {
                "v" : 1,
                "unique" : true,
                "key" : {
                        "a" : 1
                },
                "name" : "a_1",
                "ns" : "test.collection"
        }
]

以及以下文件数组:

var docs = [ { 'a': 3  }, { 'a': 4 }, { 'a': 3 } ];

您可以使用Bulk() API将文档批量插入到集合中,但需要使用无序操作,这允许MongoDB在处理写操作列表中的某个写操作时出现错误时继续处理剩余的写操作。
var docs = [{a: 3}, {a: 4}, {a: 3}]
var bulk = db.collection.initializeUnorderedBulkOp();
for(var ind=0; ind<docs.length; ind++) { 
    bulk.insert(docs[ind]); 
}
bulk.execute();

执行查询后,您将收到一个错误消息,但非重复文档将被插入到您的集合中。
在此操作之前,我们的集合为空,但在调用bulk.execute()之后,db.collection.find()将产生以下文档:
{ "_id" : ObjectId("5629c5d1e6d6a6b8e38d013c"), "a" : 3 }
{ "_id" : ObjectId("5629c5d1e6d6a6b8e38d013d"), "a" : 4 }

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接