Jag tror verkligen inte att ens som en feeder-fråga är aggregeringsramverket rätt operation att använda här. Allt du gör är att "denormalisera" arrayen som individuella dokument. Det borde verkligen inte finnas något behov. Hämta bara dokumentet istället:
var query = {}; // whatever criteria
Users.find(query,"Invitation",function(err,docs) {
if (err) {
console.log(err);
var results = [];
async.each(docs,function(doc,callback) {
async.each(docs.Invitation,function(invite,callback) {
Users.findOneAndUpdate(
{ "_id": doc._id, "Invitation._id": invite._id },
{ "$set": { "Invitation.$.Accepted": !invite.Accepted } },
function(err,doc) {
results.push( doc );
callback(err);
}
);
},callback);
},function(err) {
if (err)
console.log(err);
console.log(results);
});
});
Så det är inga problem att iterera listan med dokument i ett svar för vad du gör, det är bara att du också vill iterera arraymedlemmarna också. Haken är när du utfärdar någon form av .update()
som du måste vara medveten om då är det asynkrona samtalet klart.
Så jag använder async.each
men du vill förmodligen ha async.eachLimit
för att kontrollera looping. Matchningen av elementet kommer från positionella $
operator, motsvarande det matchade matriselementet i frågan.
Det är bara JavaScript-kod, så "växla" helt enkelt värdet med !invite.accepted
vilket kommer att vända på det. För ytterligare skoj, returnera "resultat"-arrayen genom att trycka på det modifierade dokumentet från .findOneAndUpdate()
.