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.