Позиционният оператор не работи на броя нива, на които се опитвате да го накарате да работи ( https://jira.mongodb.org/browse/SERVER-831?focusedCommentId=22438&page=com.atlassian.jira.plugin.system. issuetabpanels%3Acomment-tabpanel
) с menus.$.items.$.name
и дори да го направи, синтактичният анализатор на заявки MongoDB няма да има представа какво означава другият $
е от find
на update
.
Ще трябва да извадите елементите от схемата, да ги актуализирате отделно и след това да актуализирате основния документ.
Един добър начин да прецените кога заявките трябва да се извършват отделно е да мислите, че всяко меню звучи като отделен обект (или таблица в релационна база данни), като такъв вероятно трябва да работите върху актуализирането на тези обекти (или таблици в релационен модел) отделно до родителския обект (таблица).
Така че първо трябва да извадите главния основен документ. Превъртете през неговите менюта от страната на клиента и след това $set
това конкретно меню към целия елемент, който създавате от страна на клиента.
Редактиране
Начинът, по който си представям тази работна клиентска страна, е (в псевдо код, тъй като моята Java е малко ръждясала), като първо получа този документ по начин на активен запис:
doc = db.col.find({ "_id" : { "$oid" : "506e9e54a4e8f51423679428"} ,
"menus._id" : { "$oid" : "506e9e5aa4e8f51423679429"}});
След това ще преминете през документа, задавайки вашите стойности:
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"
}
}
}
И след това просто запишете документа, след като всички промени са ангажирани:
db.col.save(doc);
Това, разбира се, е само един начин да го направите и този начин използва парадигмата за активен запис, която аз лично харесвам. В тази идея бихте комбинирали намирането с всичко останало, което трябва да модифицирате в документа, като го изградите от страна на клиента и след това го изпратите като една единствена заявка към вашата база данни.