sql >> Base de Datos >  >> NoSQL >> MongoDB

Actualización sobre Agregado en Mongodb

Realmente no creo que incluso como una consulta de alimentador, el marco de agregación sea la operación correcta para usar aquí. Todo lo que está haciendo es "desnormalizar" la matriz como documentos individuales. Realmente no debería haber necesidad. Solo busca el documento en su lugar:

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

});

Entonces, no hay problema para iterar la lista de documentos en una respuesta a lo que está haciendo, es solo que también desea iterar los miembros de la matriz. El problema es cuando se emite cualquier tipo de .update() que debe tener en cuenta, entonces la llamada asincrónica está completa.

Así que estoy usando async.each pero probablemente quieras async.eachLimit para controlar el bucle. La coincidencia del elemento proviene del posicional $ operador, correspondiente al elemento de matriz coincidente en la consulta.

Es solo código JavaScript, así que simplemente "alterna" el valor con !invite.accepted que lo invertirá. Para mayor diversión, devuelva la matriz de "resultados" presionando el documento modificado desde .findOneAndUpdate() .