2015-10-23 51 views
4

假设我有一个要插入的文档列表。具有唯一索引的MongoDB批插入

中的文档结构如下

{ 
    url: string, 
    visited: boolean 
} 

我对url键唯一索引。

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

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

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

回答

3

假设我有一个由.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" 
     } 
] 

输出命名a作为秀场唯一索引的收集和文档下面的数组:

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

你可以使用Bulk() API将这些文档的批量插入到您的收藏中,但您需要使用允许MongoD的unordered operations B继续处理列表中剩余的写入操作,即使在处理其中一个写入操作期间发生错误。

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

不得不看看使用upsert?​​

相关问题