多くの単一の Mongo ドキュメント更新 @Node のパフォーマンスを向上させるために、Mongo の一括操作を使用して、反復ごとに 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...
});