Operator posisi tidak berfungsi pada jumlah level yang Anda coba untuk membuatnya berfungsi ( https://jira.mongodb.org/browse/SERVER-831?focusedCommentId=22438&page=com.atlassian.jira.plugin.system. issuetabpanels%3Acomment-tabpanel
) dengan menus.$.items.$.name
dan bahkan jika itu, parser kueri MongoDB tidak akan tahu apa $
. lainnya berasal dari find
dari update
.
Anda perlu mengeluarkan item dari skema, memperbaruinya secara terpisah, lalu memperbarui dokumen root.
Salah satu cara yang baik untuk menilai kapan kueri harus dilakukan secara terpisah adalah dengan berpikir bahwa setiap menu terdengar seperti entitas yang terpisah (atau tabel dalam database relasional) sehingga Anda mungkin harus berupaya memperbarui entitas tersebut (atau tabel dalam model relasional) secara terpisah ke entitas induk (tabel).
Jadi pertama-tama Anda akan mengeluarkan dokumen root utama. Gulir ke seluruh menu di sisi klien dan kemudian $set
menu khusus itu ke seluruh item yang Anda buat di sisi klien.
Sunting
Cara saya membayangkan sisi klien kerja ini (dalam kode semu karena Java saya sedikit berkarat) dengan terlebih dahulu mendapatkan dokumen itu dalam mode rekaman aktif:
doc = db.col.find({ "_id" : { "$oid" : "506e9e54a4e8f51423679428"} ,
"menus._id" : { "$oid" : "506e9e5aa4e8f51423679429"}});
Kemudian Anda akan mengulangi melalui dokumen yang menetapkan nilai Anda:
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"
}
}
}
Dan kemudian simpan dokumen dengan mudah setelah semua perubahan dilakukan:
db.col.save(doc);
Ini tentu saja hanya salah satu cara untuk melakukannya dan cara ini menggunakan paradigma activen record yang saya pribadi suka. Dalam ide ini Anda akan menggabungkan find dengan semua hal lain yang perlu Anda modifikasi pada dokumen, membangunnya di sisi klien dan kemudian mengirimkan semuanya sebagai satu permintaan tunggal ke DB Anda.