Eu realmente não acho que, mesmo como uma consulta de alimentação, a estrutura de agregação seja a operação correta a ser usada aqui. Tudo o que você está fazendo é "desnormalizar" a matriz como documentos individuais. Realmente não deveria haver necessidade. Basta buscar o documento em vez disso:
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);
});
});
Portanto, não há problema em iterar a lista de documentos em uma resposta para o que você está fazendo, é apenas que você também deseja iterar os membros da matriz. O problema é ao emitir qualquer tipo de
.update()
que você precisa estar ciente, a chamada assíncrona estará concluída. Então estou usando async.each mas você provavelmente quer async.eachLimit para controlar o loop. A correspondência do elemento vem do posicional
$
operador, correspondente ao elemento de matriz correspondente na consulta. É apenas código JavaScript, então simplesmente "alterne" o valor com
!invite.accepted
que irá invertê-lo. Para diversão adicional, retorne a matriz "results" enviando o documento modificado de .findOneAndUpdate()
.