MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Atualização no agregado no Mongodb


Eu realmente não acho que, mesmo como uma consulta de alimentação, a estrutura de agregação seja a operação correta a ser usada aqui. Tudo o que você está fazendo é "desnormalizar" a matriz como documentos individuais. Realmente não deveria haver necessidade. Basta buscar o documento em vez disso:
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);
    });    

});

Portanto, não há problema em iterar a lista de documentos em uma resposta para o que você está fazendo, é apenas que você também deseja iterar os membros da matriz. O problema é ao emitir qualquer tipo de .update() que você precisa estar ciente, a chamada assíncrona estará concluída.

Então estou usando async.each mas você provavelmente quer async.eachLimit para controlar o loop. A correspondência do elemento vem do posicional $ operador, correspondente ao elemento de matriz correspondente na consulta.

É apenas código JavaScript, então simplesmente "alterne" o valor com !invite.accepted que irá invertê-lo. Para diversão adicional, retorne a matriz "results" enviando o documento modificado de .findOneAndUpdate() .