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

Jak odzyskać nową wartość po aktualizacji we wbudowanej tablicy?

Jeśli korzystasz z MongoDB 3.0 lub nowszego, musisz użyć .findOneAndUpdate() i użyj projection możliwość określenia podzbioru pól do zwrócenia. Musisz także ustawić returnNewDocument na true . Oczywiście musisz użyć $elemMatch operator projekcji tutaj, ponieważ nie możesz użyć projekcji pozycyjnej i zwrócić nowego dokumentu.

Jak ktoś zauważył:

Powinieneś używać .findOneAndUpdate() ponieważ .findAndModify() jest wyróżniony jako przestarzały w każdym oficjalnym języku sterownika. Inną rzeczą jest to, że składnia i opcje są dość spójne we wszystkich sterownikach dla .findOneAndUpdate() . Z .findAndModify() , większość sterowników nie używa tego samego pojedynczego obiektu z kluczami "zapytanie/aktualizacja/pola". Więc jest trochę mniej zagmatwane, gdy ktoś stosuje się do innego języka, aby zachować spójność. Zmiany w ustandaryzowanym interfejsie API dla .findOneAndUpdate() faktycznie odpowiadają wersji serwera 3.x, a nie 3.2.x. Całkowite rozróżnienie polega na tym, że metody powłoki faktycznie pozostają w tyle za innymi sterownikami ( raz ! ) w implementacji metody. Tak więc większość sterowników faktycznie miała poważny wzrost wydania odpowiadający wydaniu 3.x z takimi zmianami.

db.collection.findOneAndUpdate( 
    { 
        "_id": ObjectId("56d6a7292c06e85687f44541"), 
         "rankings._id" : ObjectId("46d6a7292c06e85687f55543") 
    },  
    { $inc : { "rankings.$.score" : 1 } },  
    { 
        "projection": { 
            "rankings": { 
                "$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") } 
            }
        }, 
        "returnNewDocument": true 
    }
)

Począwszy od MongoDB 3.0, musisz użyć findAndModify i fields opcje również musisz ustawić new na true w innym, aby zwrócić nową wartość.

db.collection.findAndModify({   
    query: { 
        "_id": ObjectId("56d6a7292c06e85687f44541"), 
        "rankings._id" : ObjectId("46d6a7292c06e85687f55543") 
    },     
    update: { $inc : { "rankings.$.score" : 1 } },       
    new: true,  
    fields: { 
        "rankings": { 
            "$elemMatch": { "_id" : ObjectId("46d6a7292c06e85687f55543") }
        }  
    }
})

Wyniki obu zapytań:

{
        "_id" : ObjectId("56d6a7292c06e85687f44541"),
        "rankings" : [
                {
                        "_id" : ObjectId("46d6a7292c06e85687f55543"),
                        "name" : "Ranking 2",
                        "score" : 11
                }
        ]
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Zapytanie Mongodb z polami w tych samych dokumentach

  2. Jak mogę przeglądać lub wyszukiwać dane na żywo MongoDB?

  3. render_template z wieloma zmiennymi

  4. Projekt schematu bazy danych MongoDB

  5. Mongodb sumuje rozmiar pól tablicy