Realmente no creo que incluso como una consulta de alimentador, el marco de agregación sea la operación correcta para usar aquí. Todo lo que está haciendo es "desnormalizar" la matriz como documentos individuales. Realmente no debería haber necesidad. Solo busca el documento en su lugar:
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);
});
});
Entonces, no hay problema para iterar la lista de documentos en una respuesta a lo que está haciendo, es solo que también desea iterar los miembros de la matriz. El problema es cuando se emite cualquier tipo de .update()
que debe tener en cuenta, entonces la llamada asincrónica está completa.
Así que estoy usando async.each
pero probablemente quieras async.eachLimit
para controlar el bucle. La coincidencia del elemento proviene del posicional $
operador, correspondiente al elemento de matriz coincidente en la consulta.
Es solo código JavaScript, así que simplemente "alterna" el valor con !invite.accepted
que lo invertirá. Para mayor diversión, devuelva la matriz de "resultados" presionando el documento modificado desde .findOneAndUpdate()
.