Untuk menghapus item yang dimaksud, Anda sebenarnya akan menggunakan pembaruan. Lebih khusus lagi Anda akan melakukan pembaruan dengan $pull
perintah yang akan menghapus item dari array.
db.temp.update(
{ _id : "777" },
{$pull : {"someArray.0.someNestedArray" : {"name":"delete me"}}}
)
Ada sedikit "keajaiban" yang terjadi di sini. Menggunakan .0
menunjukkan bahwa kita tahu bahwa kita sedang memodifikasi item ke-0 dari someArray
. Menggunakan {"name":"delete me"}
menunjukkan bahwa kami mengetahui data persis yang akan kami hapus.
Proses ini berfungsi dengan baik jika Anda memuat data ke klien dan kemudian melakukan pembaruan. Proses ini bekerja kurang baik jika Anda ingin melakukan kueri "generik" yang melakukan operasi ini.
Saya pikir paling mudah untuk mengenali bahwa memperbarui larik sub-dokumen umumnya mengharuskan Anda memiliki yang asli di memori di beberapa titik.
Menanggapi komentar pertama di bawah, Anda mungkin dapat membantu situasi Anda dengan mengubah sedikit struktur data
"someObjects" : {
"name1": {
"someNestedArray" : [
{
"name" : "value"
},
{
"name" : "delete me"
}
]
}
}
Sekarang Anda dapat melakukan {$pull : { "someObjects.name1.someNestedArray" : ...
Inilah masalah dengan struktur Anda. MongoDB tidak memiliki dukungan yang sangat baik untuk memanipulasi "sub-array". Struktur Anda memiliki array objek dan objek tersebut berisi array objek lainnya.
Jika Anda memiliki struktur berikut, Anda akan kesulitan menggunakan hal-hal seperti $pull
:
array [
{ subarray : array [] },
{ subarray : array [] },
]
Jika struktur Anda terlihat seperti itu dan Anda ingin memperbarui subarray
Anda memiliki dua opsi:
- Ubah struktur Anda sehingga Anda dapat memanfaatkan
$pull
. - Jangan gunakan
$pull
. Muat seluruh objek ke klien dan gunakanfindAndModify
.