Je ne pense vraiment pas que même en tant que requête d'alimentation, le cadre d'agrégation soit la bonne opération à utiliser ici. Tout ce que vous faites est de "dénormaliser" le tableau en tant que documents individuels. Il ne devrait vraiment pas y en avoir besoin. Récupérez simplement le document :
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);
});
});
Il n'y a donc aucun problème à itérer la liste des documents dans une réponse pour ce que vous faites, c'est juste que vous voulez également itérer les membres du tableau. Le hic, c'est lors de l'émission de tout type de .update()
que vous devez savoir, l'appel asynchrone est terminé.
J'utilise donc async.each
mais vous voulez probablement async.eachLimit
pour contrôler le bouclage. La correspondance de l'élément provient du positionnel $
correspondant à l'élément de tableau correspondant dans la requête.
C'est juste du code JavaScript, alors "basculez" simplement la valeur avec !invite.accepted
qui l'inversera. Pour plus de plaisir, renvoyez le tableau "résultats" en poussant le document modifié depuis .findOneAndUpdate()
.