I když si nemyslím, že iterace přes očekávaný počet je „nejlepší“ způsob, jak toho dosáhnout, zde jsou v podstatě opravy toho, co se snažíte udělat, s určitou pomocí uzlu async
knihovna pro řízení toku:
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
}
);
Takže hlavní věcí je, že váš .update()
příkaz by měl místo toho hledat "events.handled.visibile": false
shoduje se a samozřejmě se musíte ujistit, že se operace provádějí "v sérii", jinak neexistuje skutečná záruka, že ve skutečnosti berete dokument ve změněném stavu z předchozího .update()
.
async.whilst
zpracovává řízení toku tak, že čeká na dokončení každého .update()
až do provedení dalšího. Když je jeho první logický příkaz true
( počítadlo vyčerpáno ) a všechny .update()
jsou spuštěny příkazy, pak se smyčka uvolní ke konečnému zpětnému volání.
Kde je to možné, měli byste skutečně používat operace „hromadné“ aktualizace, jak je uvedeno v odpovědi, kterou sledujete . To odešle všechny aktualizace a má pouze jednu odpověď, takže odpadá režie čekání na dokončení každé operace.