具有唯一索引的MongoDB批量插入

时间:2015-10-23 04:14:57

标签: mongodb mongodb-query

假设我有一个我要插入的文档列表。

文件的结构如下

{
  url: string,
  visited: boolean
}

我在url键上有一个唯一索引。

当我插入文档时,如果找到1个重复,则整个操作被中止。

有没有办法让我仍然可以使用批量插入,它会插入所有不重复的文件?

作为一种解决方法,我必须逐个插入文档,我担心插入开销会对性能产生影响。

2 个答案:

答案 0 :(得分:3)

假设我在名为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将这些文档批量插入到集合中,但是您需要使用unordered operations,即使发生错误,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 }

答案 1 :(得分:0)