MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Aktualizacja dotycząca agregatu w Mongodb

Naprawdę nie sądzę, że nawet jako zapytanie dostarczające framework agregacji jest właściwą operacją do użycia tutaj. Wszystko, co robisz, to „denormalizacja” tablicy jako pojedynczych dokumentów. Naprawdę nie powinno być takiej potrzeby. Zamiast tego pobierz 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);
    });    

});

Więc nie ma problemu z iteracją listy dokumentów w odpowiedzi na to, co robisz, po prostu chcesz również iterować elementy tablicy. Haczyk polega na wydawaniu dowolnego rodzaju .update() musisz być świadomy, że wywołanie asynchroniczne zostanie zakończone.

Więc używam async.each ale prawdopodobnie chcesz async.eachLimit do kontrolowania pętli. Dopasowanie elementu pochodzi z pozycyjnego $ operatora, odpowiadającego dopasowanemu elementowi tablicy w zapytaniu.

To tylko kod JavaScript, więc po prostu "przełącz" wartość za pomocą !invite.accepted co to odwróci. Dla dodatkowej zabawy zwróć tablicę "results", wypychając zmodyfikowany dokument z .findOneAndUpdate() .



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Odświeżanie przeglądarki za pomocą zdarzenia OnBeforeUnload

  2. zapytanie mongoose:znajdź obiekt według id w tablicy

  3. Nieprawidłowa liczba z zapytania agregującego

  4. Nie można połączyć się z lokalną mongoDB z java

  5. Jaka jest maksymalna głębokość osadzonych dokumentów dozwolona w MongoDb?