如果不存在,则将字段添加到集合

时间:2015-10-15 11:27:40

标签: mongodb

我有一个看起来像这样的集合:

{'flags': {'flag_1': True, 'flag_2': False: 'flag_3': True}
    'other_data': {....}}

在单个操作中,我想向现有标志添加标志列表。如果该标志已经存在,我想保持其值不变,否则它应该是假的。

例如,在添加['flag_3','flag_4']之后,该集合应该如下所示。

{'flags': {'flag_1': True, 'flag_2': False: 'flag_3': True, 'flag_4':False}
    'other_data': {....}}

由于

1 个答案:

答案 0 :(得分:1)

您可以使用 Bulk API 作为简化更新的方法,并使用一些逻辑来获取需要添加的标记。像这样:

var bulk = db.collection.initializeOrderedBulkOp(),
    counter = 0,
    flagList = ['flag_3', 'flag_4'];


db.collection.find().forEach(function(doc){
    var existingFlags = Object.keys(doc.flags), // get the existing flags in the document
        newFlags = flagList.filter(function(n) { // use filter to return an array of flags which do not exist
            return existingFlags.indexOf(n) < 0;
        }),
        update = newFlags.reduce(function(obj, k) { // set the update object 
            obj["flags."+ k] = false;
            return obj;
        }, { });

    bulk.find({ "_id": doc._id }).updateOne({
        "$set": update
    });

    counter++;
    if (counter % 1000 == 0) {
        // Execute per 1000 operations and re-initialize every 1000 update statements
        bulk.execute();
        bulk = db.collection.initializeOrderedBulkOp();
    }
})

// Clean up queues
if (counter % 1000 != 0){
    bulk.execute();
}