Positionsoperatorn fungerar inte på det antal nivåer du försöker få den att fungera på ( https://jira.mongodb.org/browse/SERVER-831?focusedCommentId=22438&page=com.atlassian.jira.plugin.system. issuetabpanels%3Acomment-tabpanel
) med menus.$.items.$.name
och även om det gjorde det skulle MongoDB frågeparser inte ha någon aning om vad den andra $
är från find
av update
.
Du måste ta ut objekten från schemat, uppdatera det separat och sedan uppdatera rotdokumentet.
Ett bra sätt att bedöma när frågor bör göras separat är att tänka att varje meny låter som en separat enhet (eller tabell i en relationsdatabas) som sådan bör du förmodligen arbeta med att uppdatera dessa enheter (eller tabeller i en relationsmodell) separat till den överordnade enheten (tabell).
Så först skulle du få ut huvudrotdokumentet. Bläddra över dess menyer på klientsidan och sedan $set
den specifika menyn till hela objektet du bygger på klientsidan.
Redigera
Så som jag föreställer mig den här arbetsklientsidan är (i pseudokod eftersom min Java är lite rostig) genom att först hämta dokumentet på ett aktivt sätt:
doc = db.col.find({ "_id" : { "$oid" : "506e9e54a4e8f51423679428"} ,
"menus._id" : { "$oid" : "506e9e5aa4e8f51423679429"}});
Sedan skulle du gå igenom dokumentet och tilldela dina värden:
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"
}
}
}
Och spara sedan enkelt dokumentet efter att alla ändringar är genomförda:
db.col.save(doc);
Detta är naturligtvis bara ett sätt att göra det och på det här sättet använder jag activen record-paradigmet som jag personligen gillar. I den här idén skulle du kombinera fyndet med allt annat du behöver ändra på dokumentet, bygga upp det på klientsidan och sedan skicka ner allt som en enda fråga till din DB.