更新MongoDB子文档的更好方法

时间:2017-05-01 06:41:07

标签: node.js mongodb mongoose

我想更新特定的子文档(多个),我有两个方法。我想知道哪一个更好。

示例文档

{ 
  _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();
});

请建议。如果有任何疑问,请告诉我。

1 个答案:

答案 0 :(得分:0)

使用Mongo shell中的Bulk API和Node.js驱动程序,在添加每个操作时,如果它与前一个操作的类型相同,则会将其添加到该类型的一批操作中。否则,它用于创建新批次。调用execute()时,这些批次按创建顺序运行。

使用批量API,我们每秒估计有4000次操作(更新了100,000条记录,每秒大约5000次操作)。只要操作类别相同,这对于进行大量操作来说是非常有用的。

根据您的代码,find / update / find / update ...的模式将使所有性能提升无效。根据经验,使用Bulk API更具吸引力的语义只能执行相同的类操作。这样,您将获得良好的表现。

所以我建议你使用method1进行操作。