4

为了提高许多单个 Mongo 文档更新@Node 的性能,我考虑使用 Mongo 的 Bulk 操作——每次迭代更新多达 1000 个文档。

在这个用例中,每个单独的更新操作可能会发生也可能不会发生 - 仅当文档版本自更新程序上次读取以来没有更改时才会发生更新。如果文档没有更新,应用程序需要重试和/或做其他事情来处理这种情况。

目前 Node 代码如下所示:

  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...

});

4

1 回答 1

1

我无法为此找到 Mongo 解决方案。

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

于 2017-09-08T19:15:10.747 回答