位置演算子は、機能させようとしているレベルの数では機能しません( https://jira.mongodb.org/browse/SERVER-831?focusedCommentId=22438&page=com.atlassian.jira.plugin.system issuetabpanels%3Acomment-tabpanel
)menus.$.items.$.name
を使用 また、MongoDBクエリパーサーが実行したとしても、他の$
が何であるかはわかりません。 find
からのものです update
の 。
スキーマからアイテムを引き出し、それを個別に更新してから、ルートドキュメントを更新する必要があります。
クエリを個別に実行する必要があるかどうかを判断する良い方法の1つは、各メニューが個別のエンティティ(またはリレーショナルデータベースのテーブル)のように聞こえるので、おそらくそれらのエンティティ(またはリレーショナルモデルのテーブル)を個別に更新する必要があると考えることです。親エンティティ(テーブル)。
したがって、最初にメインルートドキュメントを取得します。クライアント側のメニューをスクロールして、$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);
もちろん、これはそれを行う1つの方法にすぎず、この方法では、私が個人的に気に入っているactivenレコードパラダイムを使用します。このアイデアでは、検索結果をドキュメントで変更する必要のある他のすべてのものと組み合わせ、クライアント側で構築してから、すべてを1つのクエリとしてDBに送信します。