予想されるカウントを繰り返すことがこれを行うための「最良の」方法だとは思いませんが、ノード async
フロー制御用のライブラリ:
async.waterfall(
[
function(callback) {
collection.aggregate(
[
{ "$match": { "_id": ObjectId("4d2d8deff4e6c1d71fc29a07") } },
{ "$unwind": "$events" },
{ "$match": { "events.handled.visibile": false } },
{ "$group": {
"_id": "$_id",
"count": { "$sum": 1 }
}}
],
callback
);
},
function(results,callback) {
console.log(results);
var result = results[0];
async.whilst(
function() { return result.count-- },
function(callback) {
collection.update(
{ "_id": result._id, "events.handled.visibile": false },
{ "$set": { "events.$.handled.visibile": true } },
callback
)
},
callback
);
}
],
function(err) {
if (err) throw err;
// finished now
}
);
したがって、ここでの主なことは、.update()
ステートメントは、代わりに"events.handled.visibile": false
を検索する必要があります 一致します。もちろん、操作が「連続して」実行されることを確認する必要があります。そうしないと、以前の.update()
から変更された状態でドキュメントを実際に取得しているという実際の保証はありません。 。
async.whilst
各.update()
の完了を待機するようにフロー制御を処理します 次を実行するまで。最初の論理ステートメントがtrue
の場合 (カウンターが枯渇しました)およびすべての.update()
ステートメントが実行されると、ループは最後のコールバックに解放されます。