Node.js Mongo批量更新-哪些成功(匹配和修改),哪些没有? 为了提高许多单Mongo文档更新@节点的性能,我考虑使用Mango的批量操作在每次迭代中更新多达1000个文档。p>

Node.js Mongo批量更新-哪些成功(匹配和修改),哪些没有? 为了提高许多单Mongo文档更新@节点的性能,我考虑使用Mango的批量操作在每次迭代中更新多达1000个文档。p>,node.js,mongodb,bulkupdate,Node.js,Mongodb,Bulkupdate,在这个用例中,每个单独的更新操作可能会发生,也可能不会发生——只有在文档版本自更新程序上次读取以来没有更改的情况下,才会发生更新。如果文档未更新,则应用程序需要重试和/或执行其他操作以避免出现这种情况 当前节点代码如下所示: col.update( {_id: someid, version:someversion}, {$set:{stuf:toupdate, version:(someversion+1)}}, function(err,

在这个用例中,每个单独的更新操作可能会发生,也可能不会发生——只有在文档版本自更新程序上次读取以来没有更改的情况下,才会发生更新。如果文档未更新,则应用程序需要重试和/或执行其他操作以避免出现这种情况

当前节点代码如下所示:

  col.update(
        {_id: someid, version:someversion},
        {$set:{stuf:toupdate, version:(someversion+1)}},
        function(err, res) {
           if (err) {   
              console.log('wow, something is seriously wrong!');
              // do something about it...

              return;
           }
           if (!res || !res.result || !res.result.nModified) { // no update
              console.log('oops, seems like someone updated doc before me);
              // do something about it...

              return; 
           }
           // Great! - Document was updated, continue as usual...
  });
使用Mongo的批量无序操作,是否有办法知道(1000)组更新中哪些成功,哪些没有执行(在本例中是由于版本错误)

我开始使用的代码如下所示:

var bulk = col.initializeUnorderedBulkOp();
bulk.find({_id: someid1, version:someversion1}).updateOne(
                 {$set:{stuf:toupdate1, version:(someversion1+1)}});
bulk.find({_id: someid2, version:someversion2}).updateOne(
                 {$set:{stuf:toupdate2, version:(someversion2+1)}});
...
bulk.find({_id: someid1000, version:someversion1000}).updateOne(
                 {$set:{stuf:toupdate1000, version:(someversion1000+1)}});
bulk.execute(function(err, result) {
           if (err) {   
              console.log('wow, something is seriously wrong!');
              // do something about it...

              return;
           }
           if (result.nMatched < 1000) { // not all got updated
              console.log('oops, seems like someone updated at least one doc before me);
              // But which of the 1000 got updated OK and which had not!!!!

              return; 
           }
           // Great! - All 1000 documents got updated, continue as usual...
var bulk=col.initializeunderedbulkop();
bulk.find({u id:someid1,version:someversion1}).updateOne(
{$set:{stuf:toupdate1,version:(someversion1+1)};
bulk.find({u id:someid2,version:someversion2}).updateOne(
{$set:{stuf:toupdate2,version:(someversion2+1)};
...
bulk.find({u id:someid1000,版本:someversion1000}).updateOne(
{$set:{stuf:toupdate1000,version:(someversion1000+1)});
bulk.execute(函数(错误、结果){
如果(错误){
log(‘哇,有严重的问题!’);
//做点什么吧。。。
返回;
}
如果(result.nMatched<1000){//未更新所有
log('oops,似乎有人在我之前至少更新了一个文档);
//但是1000个中哪一个得到了更新,哪一个没有!!!!
返回;
}
//太好了!-所有1000个文档都更新了,照常继续。。。

}))

我找不到解决这个问题的Mongo解决方案


我使用的解决方案是,如果批量操作失败,则恢复到每个文档操作。。。这在大多数情况下提供了合理的性能

到目前为止有什么发现吗???@davidhadas-你找到解决办法了吗?@Randy见下面的答案。