如何使用upsert

时间:2015-08-11 09:19:35

标签: mongodb mongodb-query

我收藏了这样的文件

        <script> 
        $(".something") th {
           font - size: 2em; /* em is relative to the parent font size */
           font - weight: bold;
       }
       </script>

现在我有一系列文档准备像这样

插入或更新到这个集合
[
    { _id : ObjectId("xxxxxx") , u_id : 5 , name : "E" , comment : [1,2] },
    { _id : ObjectId("yyyyyy") , u_id : 4 , name : "D" , comment : [] },
    { _id : ObjectId("zzzzzz") , u_id : 3 , name : "C" , comment : [1,2] },
    { _id : ObjectId("aaaaaa") , u_id : 2 , name : "B" , comment : [1,2] },
    { _id : ObjectId("bbbbbb") , u_id : 1 , name : "A" , comment : [1] },
]

我可以使用var multi_document = [ { u_id : 8 , name : "H" , comment : [1,2] }, //Insert new document { u_id : 7 , name : "G" , comment : [] }, //Insert new document { u_id : 6 , name : "F" , comment : [1,2] }, //Insert new document { u_id : 5 , name : "E" , comment : [1,2,3] }, //update [1,2] to [1,2,3] { u_id : 4 , name : "DD" , comment : [1] }, //update D to DD and [] to [1] { u_id : 3 , name : "C" , comment : [1,2] }, //not do anything it same original ]; ; ?如果没有,我该怎么办?

这是预期的结果:

db.collection.update(multi_document)

2 个答案:

答案 0 :(得分:2)

执行此操作的最佳方法是使用"Bulk" API。

首先,您需要遍历multi_document数组以及集合中的每个文档,以及具有相同u_id的文档。为此,我们需要使用bulk.find.upsert方法将upsert设置为true,然后使用.update方法指定要更新的字段,此处comment 。在更新文档中,您需要使用$addToSet运算符来确保评论字段和$each修饰符中没有重复项,因为comment是一个数组。

var bulk = db.collection.initializeOrderedBulkOp(),
    count  = 0;

multi_document.forEach( function (doc) { 
    bulk.find({ "u_id": doc.u_id })
        .upsert()
        .update({
            "$set": { "name": doc.name }, 
            "$addToSet": { "comment": { "$each": doc.comment }}
        }); 

    count++;

    if ( count % 1000 == 0 ) {

        // Execute per 1000 operations and re-init. 

        bulk.execute();     
        bulk = db.collection.initializeOrderedBulkOp(); 
    } 
})


// Clean up queues

if ( count % 1000 != 0 )
    bulk.execute();

答案 1 :(得分:1)

您可以使用批量()http://docs.mongodb.org/manual/reference/method/Bulk/

  

使用有序操作列表,MongoDB以串行方式执行列表中的写操作。如果在处理其中一个写操作期间发生错误,MongoDB将返回而不处理列表中任何剩余的写操作。

有趣的博客关于批量API的文章:http://blog.mongodb.org/post/84922794768/mongodbs-new-bulk-api