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见下面的答案。