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

Jak skonstruować zapytanie, aby zaktualizować zagnieżdżony dokument tablicy w mongo?

Operator pozycyjny nie działa na liczbie poziomów, na których próbujesz go uruchomić ( https://jira.mongodb.org/browse/SERVER-831?focusedCommentId=22438&page=com.atlassian.jira.plugin.system. Issuetabpanels%3Acomment-tabpanel ) z menus.$.items.$.name a nawet gdyby tak było, parser zapytań MongoDB nie miałby pojęcia, co inne $ pochodzi z find update .

Będziesz musiał wyciągnąć elementy ze schematu, zaktualizować je osobno, a następnie zaktualizować dokument główny.

Dobrym sposobem oceny, kiedy zapytania powinny być wykonywane osobno, jest myślenie, że każde menu brzmi jak oddzielna encja (lub tabela w relacyjnej bazie danych) jako taka, powinieneś prawdopodobnie pracować nad aktualizacją tych encji (lub tabel w modelu relacyjnym) oddzielnie, aby podmiot nadrzędny (tabela).

Więc najpierw wyjmiesz główny dokument główny. Przewiń jego menu po stronie klienta, a następnie $set to konkretne menu do całego elementu, który zbudujesz po stronie klienta.

Edytuj

Wyobrażam sobie tę stronę klienta pracy (w pseudokodzie, ponieważ moja Java jest trochę zardzewiała), pobierając ten dokument w trybie aktywnego rekordu:

doc = db.col.find({ "_id" : { "$oid" : "506e9e54a4e8f51423679428"} , 
    "menus._id" : { "$oid" : "506e9e5aa4e8f51423679429"}});

Następnie możesz przejść przez dokument, przypisując swoje wartości:

foreach(doc.menus as menu_key => menu){
    foreach(menu['items'] as key => item){
        if(item._id ==  { "$oid" : "506e9f07a4e8f5142367942f"}){
            doc.menus[menu_key][key][name] = "xcvxc66666"
        }
    }
}

A potem po prostu zapisz dokument po zatwierdzeniu wszystkich zmian:

db.col.save(doc);

To oczywiście tylko jeden ze sposobów, w jaki można to zrobić i w ten sposób wykorzystuje się paradygmat activen record, który osobiście lubię. W tym pomyśle połączysz znalezisko ze wszystkim, co musisz zmodyfikować w dokumencie, budując je po stronie klienta, a następnie wysyłając je jako jedno zapytanie do bazy danych.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Przestaw wiersze na kolumny w MongoDB

  2. jak uzyskać maksymalną wartość pola w MongoDB

  3. Błąd:querySrv ENODATA _mongodb._tcp.blog-cluster-0hb5z.mongodb.net w QueryReqWrap.onresolve [jako ukończone]

  4. Zmień kształt dokumentów, dzieląc wartość pola

  5. Prześlij dane do Meteor / Mongo DB