Masalahnya adalah Anda tidak dapat menggunakan $
operator untuk menunjukkan kecocokan pada level bersarang dalam array. Dan yang terpenting Anda hanya bisa menentukan sekali.
Sebagaimana dinyatakan dari dokumentasi
, apakah itu $
akan hanya cocok dengan pertama elemen ditemukan. Itu bukan hanya berarti jika Anda memiliki beberapa kecocokan untuk kueri Anda, maka hanya yang pertama yang akan dipilih, itu juga berarti bahwa hanya pertama cocok posisi array akan digunakan. Itu berarti sesuatu seperti ini juga tidak akan berhasil:
{ $set: { '_children.addressesR.1._children.configId.a._children.$.b': 30 }
Karena itu akan secara keliru cocok dengan index
1
nilai dan perbarui item yang tidak Anda harapkan.
Jika Anda dapat memperbarui keseluruhan array maka yang berikut ini akan berfungsi:
{ $set: {"_children.addressesR.$._children.configId.a._children": [ { b: 10}, { b: 30} ] } }
Itu seperti yang saya katakan, karena index
cocok untuk pertama larik.
Tetapi mengingat struktur yang Anda miliki, tampaknya pilihan terbaik Anda adalah mengubah array tingkat atas itu menjadi subdokumen. Kecuali dalam kenyataannya ini memiliki alasan untuk menjadi sebuah array, bukan dua jenis dokumen campuran yang tampak seperti sekarang.