Opravdu si nemyslím, že i jako feeder dotaz je agregační rámec tou správnou operací, kterou zde použít. Jediné, co děláte, je „denormalizace“ pole jako jednotlivých dokumentů. Opravdu by to nemělo být potřeba. Stačí místo toho načíst 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);
});
});
Není tedy žádný problém iterovat seznam dokumentů v odpovědi na to, co děláte, jen chcete také iterovat členy pole. Háček je při vydávání jakéhokoli druhu .update()
že si musíte být vědomi, že je asynchronní volání dokončeno.
Takže používám async.each
ale pravděpodobně chcete async.eachLimit
k ovládání smyčky. Shoda prvku pochází z pozičního $
operátor odpovídající odpovídajícímu prvku pole v dotazu.
Je to pouze kód JavaScript, takže jednoduše „přepněte“ hodnotu pomocí !invite.accepted
který to převrátí. Pro další zábavu vraťte pole „results“ odesláním upraveného dokumentu z .findOneAndUpdate()
.