Inilah pertanyaan besarnya, apakah Anda perlu memanfaatkan operasi "addToSet" dan "push" Mongo? Jika Anda benar-benar berencana untuk memodifikasi item individual saja dalam array, maka Anda mungkin harus membangun array ini sebagai objek.
Inilah cara saya menyusun ini:
{
id: 1,
items:
{
"2" : { "blocks" : { "3" : { txt : 'hello' } } },
"5" : { "blocks" : { "1" : { txt : 'foo'}, "2" : { txt : 'bar'} } }
}
}
Ini pada dasarnya mengubah semuanya menjadi objek JSON alih-alih array. Anda kehilangan kemampuan untuk menggunakan $push
dan $addToSet
tapi saya pikir ini membuat segalanya lebih mudah. Misalnya, kueri Anda akan terlihat seperti ini:
db.objects.update({'items.2': {$exists:true} }, {'$set': {'items.2.blocks.0.txt': 'hi'}})
Anda juga akan melihat bahwa saya telah membuang "ID". Saat Anda menyusun hal-hal seperti ini, Anda biasanya dapat mengganti "ID" dengan hanya menggunakan nomor itu sebagai indeks. Konsep "ID" sekarang tersirat.
Fitur ini telah ditambahkan di 3.6 dengan pembaruan ekspresif.
db.objects.update( {id: 1 }, { $set: { 'items.$[itm].blocks.$[blk].txt': "hi", } }, { multi: false, arrayFilters: [ { 'itm.id': 2 }, { 'blk.id': 3} ] } )