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

Aggiornamento su Aggregate in Mongodb

Non penso davvero che anche come query feeder il framework di aggregazione sia l'operazione giusta da usare qui. Tutto quello che stai facendo è "denormalizzare" l'array come singoli documenti. Non dovrebbe esserci davvero bisogno. Prendi invece il documento:

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

});

Quindi non c'è problema nell'iterare l'elenco di documenti in una risposta per quello che stai facendo, è solo che vuoi anche iterare anche i membri dell'array. Il problema è quando si emette qualsiasi tipo di .update() che devi essere consapevole che la chiamata asincrona è completa.

Quindi sto usando async.each ma probabilmente vuoi async.eachLimit per controllare il ciclo. La corrispondenza dell'elemento deriva dal posizionale $ operatore, corrispondente all'elemento dell'array corrispondente nella query.

È solo codice JavaScript, quindi "commuta" semplicemente il valore con !invite.accepted che lo invertirà. Per ulteriore divertimento, restituisci l'array "results" eseguendo il push del documento modificato da .findOneAndUpdate() .