Di MongoDB, Anda dapat menggunakan $pull
operator untuk menghapus nilai dari array.
Gunakan $pull
dalam hubungannya dengan metode seperti update()
untuk memperbarui dokumen yang ditentukan dengan perubahan.
Contoh
Misalkan kita memiliki koleksi yang disebut products
dengan dokumen sebagai berikut:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL", "XXL" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
Kami dapat menghapus elemen dari array di dokumen 1 seperti ini:
db.products.update(
{ _id: 1 },
{ $pull: { sizes: "XXL" } }
)
Keluaran:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Pesan itu memberi tahu kita bahwa satu dokumen cocok dan satu (yaitu dokumen yang sama) telah dimodifikasi.
Yuk intip koleksinya sekarang:
db.products.find()
Hasil:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] }
Kita dapat melihat bahwa array pada dokumen 1 memiliki nilai XXL
dihapus seperti yang ditentukan.
Hapus Beberapa Nilai
Kita dapat menggunakan $in
operator untuk menentukan beberapa nilai yang ingin kita hapus dari larik.
Contoh:
db.products.update(
{ _id: 3 },
{ $pull: { sizes: { $in: ["XS", "XL"] } } }
)
Keluaran:
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
Sekarang mari kita periksa kembali koleksinya:
db.products.find()
Hasil:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] }
Kita dapat melihat bahwa dua elemen yang ditentukan telah dihapus dari array di dokumen 3.
Perbarui Semua Dokumen
Anda dapat menambahkan multi: true
atau gunakan updateMany()
metode untuk memperbarui semua dokumen yang sesuai dengan kriteria.
Saat Anda melakukan ini, hapus kriteria pemilihan apa pun dari dokumen kueri pertama (yang menentukan dokumen mana yang akan diperbarui). Dengan kata lain, gunakan dokumen kosong sebagai argumen pertama ke update()
(atau updateMany()
) metode.
Contoh:
db.products.update(
{ },
{ $pull: { sizes: "XL" } },
{ multi: true }
)
Keluaran:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })
Dalam hal ini, kita dapat melihat bahwa tiga dokumen cocok (karena ada tiga dokumen dalam koleksi), tetapi hanya dua yang dimodifikasi (karena hanya dua yang memiliki nilai XL
dalam sizes
susunan).
Dan periksa kembali koleksinya:
db.products.find()
Hasil:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "S", "M", "L" ] }
Kita dapat melihat bahwa semua instance XL
telah dihapus dari semua dokumen dalam koleksi.
Array Dokumen
Jika Anda memiliki larik yang berisi dokumen sebagai elemennya, Anda dapat menghapus salah satu dokumen tersebut dengan menentukan kriteria yang cocok dengan data di dalam dokumen.
Misalkan kita memiliki koleksi yang disebut restoran yang dokumen-dokumen berikut:
{ "_id" : 1, "name" : "The Rat", "reviews" : [ { "name" : "Stanley", "date" : "04 December, 2020", "ordered" : "Dinner", "rating" : 1 }, { "name" : "Tom", "date" : "04 October, 2020", "ordered" : "Lunch", "rating" : 2 } ] } { "_id" : 2, "name" : "Yum Palace", "reviews" : [ { "name" : "Stacey", "date" : "08 December, 2020", "ordered" : "Lunch", "rating" : 3 }, { "name" : "Tom", "date" : "08 October, 2020", "ordered" : "Breakfast", "rating" : 4 } ] } { "_id" : 3, "name" : "Boardwalk Cafe", "reviews" : [ { "name" : "Steve", "date" : "20 December, 2020", "ordered" : "Breakfast", "rating" : 5 }, { "name" : "Lisa", "date" : "25 October, 2020", "ordered" : "Dinner", "rating" : 5 }, { "name" : "Kim", "date" : "21 October, 2020", "ordered" : "Dinner", "rating" : 5 } ] }
Dalam hal ini, bidang yang disebut reviews
berisi kumpulan dokumen. Setiap dokumen review berbeda dari restoran yang bersangkutan.
Kita bisa menggunakan $pull
untuk menghapus ulasan yang cocok dengan kriteria tertentu.
Contoh:
db.restaurants.update(
{ },
{ $pull: { reviews: { rating: { $lt: 4 } } } },
{ multi: true }
)
Keluaran:
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 2 })
Pesan ini memberi tahu kami bahwa tiga dokumen cocok dengan kriteria kueri (karena kami memilih semua dokumen), dan dua dokumen telah dimodifikasi (karena dua cocok dengan $pull
kami kriteria).
Yuk cek lagi koleksinya untuk melihat efeknya:
db.restaurants.find().pretty()
Hasil:
{ "_id" : 1, "name" : "The Rat", "reviews" : [ ] } { "_id" : 2, "name" : "Yum Palace", "reviews" : [ { "name" : "Tom", "date" : "08 October, 2020", "ordered" : "Breakfast", "rating" : 4 } ] } { "_id" : 3, "name" : "Boardwalk Cafe", "reviews" : [ { "name" : "Steve", "date" : "20 December, 2020", "ordered" : "Breakfast", "rating" : 5 }, { "name" : "Lisa", "date" : "25 October, 2020", "ordered" : "Dinner", "rating" : 5 }, { "name" : "Kim", "date" : "21 October, 2020", "ordered" : "Dinner", "rating" : 5 } ] }
Kita dapat melihat bahwa hanya ulasan dengan peringkat 4 ke atas yang tersisa. Semua ulasan kurang dari 4 telah dihapus.