Dalam contoh berikut, asumsikan dokumen ada dalam koleksi db.people .
Bagaimana cara menghapus elemen ke-3 dari array minat dengan indeksnya ?
{
"_id" : ObjectId("4d1cb5de451600000000497a"),
"name" : "dannie",
"interests" : [
"guitar",
"programming",
"gadgets",
"reading"
]
}
Ini solusi saya saat ini:
var interests = db.people.findOne({"name":"dannie"}).interests;
interests.splice(2,1)
db.people.update({"name":"dannie"}, {"$set" : {"interests" : interests}});
Apakah ada cara yang lebih langsung?
Jawaban:
Tidak ada cara langsung untuk menarik / menghapus dengan indeks array. Sebenarnya, ini adalah terbitan terbuka http://jira.mongodb.org/browse/SERVER-1014 , Anda dapat memilihnya.
Solusinya adalah menggunakan $ unset dan kemudian $ pull:
Pembaruan: seperti yang disebutkan dalam beberapa komentar, pendekatan ini tidak atomic dan dapat menyebabkan beberapa kondisi balapan jika klien lain membaca dan / atau menulis di antara dua operasi. Jika kita membutuhkan operasi menjadi atom, kita dapat:
sumber
Anda dapat menggunakan
$pull
pengubahupdate
operasi untuk menghapus elemen tertentu dalam array. Jika Anda memberikan kueri akan terlihat seperti ini:Juga, Anda dapat mempertimbangkan menggunakan
$pullAll
untuk menghapus semua kejadian. Lebih lanjut tentang ini di halaman dokumentasi resmi - http://www.mongodb.org/display/DOCS/Updating#Updating-%24pullIni tidak menggunakan indeks sebagai kriteria untuk menghapus elemen, tetapi masih dapat membantu dalam kasus yang serupa dengan Anda. IMO, menggunakan indeks untuk menangani elemen di dalam array sangat tidak dapat diandalkan karena mongodb tidak konsisten pada urutan elemen seperti yang saya tahu.
sumber
Alih-alih menggunakan unset (seperti pada jawaban yang diterima), saya menyelesaikan ini dengan mengatur bidang ke nilai unik (yaitu bukan NULL) dan kemudian segera menarik nilai itu. Sedikit lebih aman dari perspektif asynch. Ini kodenya:
Mudah-mudahan mongo akan mengatasi hal ini, mungkin dengan memperluas pengubah $ position untuk mendukung $ pull serta $ push.
sumber
Saya akan merekomendasikan menggunakan bidang GUID (Saya cenderung menggunakan ObjectID), atau bidang auto-incrementing untuk setiap sub-dokumen dalam larik.
Dengan GUID ini, mudah untuk mengeluarkan $ pull dan memastikan bahwa yang benar akan ditarik. Hal yang sama berlaku untuk operasi array lainnya.
sumber
Mulai dari
Mongo 4.4
,$function
operator agregasi memungkinkan penerapan fungsi javascript khusus untuk mengimplementasikan perilaku yang tidak didukung oleh Bahasa Kueri MongoDB.Misalnya, untuk memperbarui array dengan menghapus elemen pada indeks tertentu:
$function
membutuhkan 3 parameter:body
, yang merupakan fungsi untuk diterapkan, yang parameternya adalah larik yang akan diubah. Fungsi di sini hanya terdiri dari penggunaan sambatan untuk menghapus 1 elemen pada indeks 2.args
, yang berisi bidang dari rekaman yangbody
diambil fungsi sebagai parameter. Dalam kasus kami"$interests"
.lang
, yang merupakan bahasabody
penulisan fungsi. Hanyajs
saat ini tersedia.sumber
di Mongodb 4.2 Anda bisa melakukan ini:
P adalah indeks elemen yang ingin Anda hapus dari array.
Jika Anda ingin menghapus dari P sampai akhir:
sumber
Untuk orang yang mencari jawaban menggunakan luwak dengan nodejs. Beginilah cara saya melakukannya.
Saya dapat menulis ulang jawaban ini jika tidak dipahami dengan baik, tetapi menurut saya tidak masalah.
Semoga ini membantu Anda, saya kehilangan banyak waktu menghadapi masalah ini.
sumber
Alih-alih menggunakan $ pull, kita dapat menggunakan $ pop untuk menghapus elemen dalam array dengan indeksnya. Tetapi Anda harus mengurangi 1 dari posisi indeks untuk menghapus berdasarkan indeks.
Untuk Misal jika ingin menghapus elemen pada index 0 sebaiknya gunakan -1, untuk index 1 sebaiknya gunakan 0 dan seterusnya ...
Kueri Untuk Menghapus Elemen ke-3 (gadget):
db.people.update({"name":"dannie"}, {'$pop': {"interests": 1}})
untuk referensi: https://docs.mongodb.com/manual/reference/operator/update/pop/
sumber
$pop
hanya dapat menghapus elemen pertama atau terakhir dari array. Kueri dalam jawaban ini tidak menghapus elemen ketiga.