MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Mise à jour sur l'agrégat dans Mongodb

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() .