Non penso davvero che anche come query feeder il framework di aggregazione sia l'operazione giusta da usare qui. Tutto quello che stai facendo è "denormalizzare" l'array come singoli documenti. Non dovrebbe esserci davvero bisogno. Prendi invece il documento:
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);
});
});
Quindi non c'è problema nell'iterare l'elenco di documenti in una risposta per quello che stai facendo, è solo che vuoi anche iterare anche i membri dell'array. Il problema è quando si emette qualsiasi tipo di .update()
che devi essere consapevole che la chiamata asincrona è completa.
Quindi sto usando async.each
ma probabilmente vuoi async.eachLimit
per controllare il ciclo. La corrispondenza dell'elemento deriva dal posizionale $
operatore, corrispondente all'elemento dell'array corrispondente nella query.
È solo codice JavaScript, quindi "commuta" semplicemente il valore con !invite.accepted
che lo invertirà. Per ulteriore divertimento, restituisci l'array "results" eseguendo il push del documento modificato da .findOneAndUpdate()
.