Di MongoDB, saat Anda memperbarui dokumen yang berisi array, Anda memiliki opsi untuk menggunakan arrayFilters
parameter.
arrayFilters
parameter memungkinkan Anda untuk menentukan larik dokumen filter yang menentukan elemen larik mana yang akan dimodifikasi.
Dalam dokumen pembaruan, gunakan $[<identifier>]
operator posisi terfilter, yang mengidentifikasi elemen larik yang cocok dengan arrayFilters
kondisi untuk operasi pembaruan.
Sintaks
Sintaksnya seperti ini:
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }
Jadi misalnya, ketika digunakan dengan updateMany()
caranya seperti ini:
db.collection.updateMany(
{ <query conditions> },
{ <update operator>: { "<array>.$[<identifier>]" : value } },
{ arrayFilters: [ { <identifier>: <condition> } ] }
)
Contoh
Misalkan kita memiliki koleksi yang disebut players
dengan dokumen sebagai berikut:
{ "_id" : 1, "scores" : [ 1, 5, 17 ] } { "_id" : 2, "scores" : [ 8, 17, 18 ] } { "_id" : 3, "scores" : [ 15, 11, 8 ] }
Kita bisa menggunakan arrayFilters
parameter untuk memperbarui hanya elemen larik yang memiliki nilai lebih tinggi dari jumlah tertentu.
Contoh:
db.players.updateMany(
{ scores: { $gte: 10 } },
{ $set: { "scores.$[e]" : 10 } },
{ arrayFilters: [ { "e": { $gte: 10 } } ] }
)
Hasil:
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }
Pesan tersebut memberi tahu kita bahwa tiga dokumen dicocokkan dan dimodifikasi.
Begini tampilan dokumennya sekarang.
db.players.find()
Hasil:
{ "_id" : 1, "scores" : [ 1, 5, 10 ] } { "_id" : 2, "scores" : [ 8, 10, 10 ] } { "_id" : 3, "scores" : [ 10, 10, 8 ] }
Kita dapat melihat bahwa semua nilai yang sebelumnya lebih besar atau sama dengan 10 sekarang menjadi 10.
Dalam hal ini, saya menggunakan e
sebagai <identifier>
. Perhatikan bahwa <identifier>
harus dimulai dengan huruf kecil dan hanya berisi karakter alfanumerik.