我有一个看起来像这样的集合:
{'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': {....}}
由于
答案 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();
}