我想更新特定的子文档(多个),我有两个方法。我想知道哪一个更好。
示例文档
{
_id: 1,
doc: [{
prop1: false,
prop2: 1
},{
prop1: false,
prop2: 1
},{
prop1: true,
prop2: 2
}]
}
方法1:
db.docs.findOne({}, function(err, result){
if(err || !result) return next(err || []);
result.doc.forEach(function(doc){
if(doc.prop2 === 1){
doc.prop1 = true;
}
});
doc.save();
});
方法2:
db.docs.findOne({_id: 1}, function(err, result){
if(err || !result) return next(err || []);
var bulk = db.docs.initializeUnorderedBulkOp();
result.doc.forEach(function(doc){
if(doc.prop2 === 1){
bulk.find({
_id: 1,
"doc.prop2": 1
}).update({
$set: {
"doc.$.prop1": true
}
});
}
});
bulk.execute();
});
请建议。如果有任何疑问,请告诉我。
答案 0 :(得分:0)
使用Mongo shell中的Bulk API和Node.js驱动程序,在添加每个操作时,如果它与前一个操作的类型相同,则会将其添加到该类型的一批操作中。否则,它用于创建新批次。调用execute()时,这些批次按创建顺序运行。
使用批量API,我们每秒估计有4000次操作(更新了100,000条记录,每秒大约5000次操作)。只要操作类别相同,这对于进行大量操作来说是非常有用的。
根据您的代码,find / update / find / update ...的模式将使所有性能提升无效。根据经验,使用Bulk API更具吸引力的语义只能执行相同的类操作。这样,您将获得良好的表现。
所以我建议你使用method1进行操作。