Hoewel ik niet denk dat het herhalen van een verwacht aantal de "beste" manier is om dit te doen, zijn hier in feite de correcties op wat je probeert te doen, met wat hulp van het knooppunt async
bibliotheek voor stroomregeling:
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
}
);
Dus de belangrijkste dingen hier zijn dat uw .update()
statement zou in plaats daarvan moeten zoeken naar de "events.handled.visibile": false
overeenkomsten, en natuurlijk moet u ervoor zorgen dat de bewerkingen "in serie" worden uitgevoerd, anders is er geen echte garantie dat u het document in feite in een gewijzigde staat pakt ten opzichte van de vorige .update()
.
De async.whilst
behandelt de flow control zodat het wacht op de voltooiing van elke .update()
tot het uitvoeren van de volgende. Wanneer de eerste logische verklaring true
is ( teller uitgeput ) en alle .update()
instructies worden uitgevoerd, dan wordt de lus vrijgegeven voor de laatste callback.
Waar mogelijk zou u echt "Bulk"-updatebewerkingen moeten gebruiken, zoals vermeld in het antwoord dat u volgt . Die verzendt alle updates en heeft slechts één reactie, dus de overhead van het wachten tot elke bewerking is voltooid, wordt geëlimineerd.