Naprawdę nie sądzę, że nawet jako zapytanie dostarczające framework agregacji jest właściwą operacją do użycia tutaj. Wszystko, co robisz, to „denormalizacja” tablicy jako pojedynczych dokumentów. Naprawdę nie powinno być takiej potrzeby. Zamiast tego pobierz dokument:
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);
});
});
Więc nie ma problemu z iteracją listy dokumentów w odpowiedzi na to, co robisz, po prostu chcesz również iterować elementy tablicy. Haczyk polega na wydawaniu dowolnego rodzaju .update()
musisz być świadomy, że wywołanie asynchroniczne zostanie zakończone.
Więc używam async.each
ale prawdopodobnie chcesz async.eachLimit
do kontrolowania pętli. Dopasowanie elementu pochodzi z pozycyjnego $
operatora, odpowiadającego dopasowanemu elementowi tablicy w zapytaniu.
To tylko kod JavaScript, więc po prostu "przełącz" wartość za pomocą !invite.accepted
co to odwróci. Dla dodatkowej zabawy zwróć tablicę "results", wypychając zmodyfikowany dokument z .findOneAndUpdate()
.