MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Bagaimana cara membuat kueri untuk memperbarui dokumen array bersarang di mongo?

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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cara menjalankan perintah sekali dalam penulisan Docker

  2. koneksi mongodb grails ditolak

  3. Bagaimana cara membuat kueri equals dinamis menggunakan Apache Camel dan MongoDB?

  4. Array objek skema luwak

  5. Apakah AWS DocumentDB Mendukung Penggabungan 3+ Koleksi Dalam Satu Kueri?