sql >> Databasteknik >  >> NoSQL >> MongoDB

Uppdatering om Aggregate i Mongodb

Jag tror verkligen inte att ens som en feeder-fråga är aggregeringsramverket rätt operation att använda här. Allt du gör är att "denormalisera" arrayen som individuella dokument. Det borde verkligen inte finnas något behov. Hämta bara dokumentet istället:

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);
    });    

});

Så det är inga problem att iterera listan med dokument i ett svar för vad du gör, det är bara att du också vill iterera arraymedlemmarna också. Haken är när du utfärdar någon form av .update() som du måste vara medveten om då är det asynkrona samtalet klart.

Så jag använder async.each men du vill förmodligen ha async.eachLimit för att kontrollera looping. Matchningen av elementet kommer från positionella $ operator, motsvarande det matchade matriselementet i frågan.

Det är bara JavaScript-kod, så "växla" helt enkelt värdet med !invite.accepted vilket kommer att vända på det. För ytterligare skoj, returnera "resultat"-arrayen genom att trycka på det modifierade dokumentet från .findOneAndUpdate() .



  1. mongoDB vitlista IP

  2. MongoDB $gt Aggregation Pipeline Operator

  3. Meteordatabasanslutning

  4. Node.js Mongoose.js sträng till ObjectId funktion