sql >> Databáze >  >> NoSQL >> MongoDB

Aktualizace na Aggregate v Mongodb

Opravdu si nemyslím, že i jako feeder dotaz je agregační rámec tou správnou operací, kterou zde použít. Jediné, co děláte, je „denormalizace“ pole jako jednotlivých dokumentů. Opravdu by to nemělo být potřeba. Stačí místo toho načíst dokument:

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

});

Není tedy žádný problém iterovat seznam dokumentů v odpovědi na to, co děláte, jen chcete také iterovat členy pole. Háček je při vydávání jakéhokoli druhu .update() že si musíte být vědomi, že je asynchronní volání dokončeno.

Takže používám async.each ale pravděpodobně chcete async.eachLimit k ovládání smyčky. Shoda prvku pochází z pozičního $ operátor odpovídající odpovídajícímu prvku pole v dotazu.

Je to pouze kód JavaScript, takže jednoduše „přepněte“ hodnotu pomocí !invite.accepted který to převrátí. Pro další zábavu vraťte pole „results“ odesláním upraveného dokumentu z .findOneAndUpdate() .



  1. Jaký je rozdíl mezi žurnálovou a nežurnálovou databází Mongodb

  2. Jak mohu použít ne jako na laravel mongodb?

  3. Mongoose aktualizace více dokumentů neaktualizuje nic

  4. MongoDb - Jak mohu aktualizovat více prvků vnořeného objektu pomocí $set?