sql >> Database teknologi >  >> NoSQL >> MongoDB

Opdatering om Aggregate i Mongodb

Jeg tror virkelig ikke, at selv som feederforespørgsel er aggregeringsrammen den rigtige operation at bruge her. Alt du gør er at "denormalisere" arrayet som individuelle dokumenter. Der burde virkelig ikke være behov. Bare hent dokumentet i stedet:

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å der er ikke noget problem at iterere listen over dokumenter i et svar på det, du laver, det er bare, at du også vil gentage array-medlemmerne. Fangsten er, når du udsteder enhver form for .update() at du skal være opmærksom på, så er det asynkrone opkald afsluttet.

Så jeg bruger async.each men du vil sandsynligvis have async.eachLimit for at kontrollere sløjfen. Matchningen af ​​elementet kommer fra positionelle $ operator, svarende til det matchede array-element i forespørgslen.

Det er kun JavaScript-kode, så du skal blot "skifte" værdien med !invite.accepted hvilket vil vende det om. For yderligere sjov kan du returnere "resultater"-arrayet ved at skubbe det ændrede dokument fra .findOneAndUpdate() .



  1. mgo - forespørgselsydeevne virker konsekvent langsom (500-650ms)

  2. MongoDB-forbindelsesfejl i Digital Ocean-dråbe

  3. MongoDB $addToSet

  4. Skip/Mock Redis In Junit