Bagaimana cara menghapus elemen array di mongodb?

130

Berikut adalah struktur array

contact: {
    phone: [
        {
            number: "+1786543589455",
            place: "New Jersey",
            createdAt: ""
        }
        {
            number: "+1986543589455",
            place: "Houston",
            createdAt: ""
        }

    ]
}

Di sini saya hanya tahu mongo id ( _id) dan nomor telepon ( +1786543589455) dan saya perlu menghapus seluruh elemen array yang sesuai dari dokumen. yaitu elemen nol yang diindeks dalam larik telepon dicocokkan dengan nomor telepon dan perlu menghapus elemen larik yang sesuai.

contact: {
    phone: [
        {
            number: "+1986543589455",
            place: "Houston",
            createdAt: ""
        }
    ]
}

Saya mencoba dengan metode pembaruan berikut

collection.update(
    { _id: id, 'contact.phone': '+1786543589455' },
    { $unset: { 'contact.phone.$.number': '+1786543589455'} }
);

Tapi itu menghapus number: +1786543589455dari objek array dalam, bukan elemen yang diindeks nol dalam array telepon. Mencoba pulljuga tanpa hasil.

Bagaimana cara menghapus elemen array di mongodb?

Justin John
sumber

Jawaban:

238

Coba kueri berikut:

collection.update(
  { _id: id },
  { $pull: { 'contact.phone': { number: '+1786543589455' } } }
);

Ini akan menemukan dokumen dengan yang diberikan _iddan menghapus telepon +1786543589455dari contact.phonelariknya.

Anda dapat menggunakan untuk menghapus $unsetnilai dalam larik (setel ke null), tetapi tidak untuk menghapusnya sepenuhnya.

Leonid Beschastny
sumber
3
Terima kasih. Ini bekerja dengan baik. Saya mencoba dengan { $pull: { 'contact.phone.$': { 'contact.phone.$.number': '+1786543589455' } } }dan { $pull: { 'contact.phone': { 'contact.phone.$.number': '+1786543589455' } } }tanpa hasil. Tidak mengerti cara kerja operator posisi di sini?
Justin John
1
Apakah ada panggilan balik dengan ini?
Oliver Dixon
1
@iLoveUnicorns Anda bisa menambahkan callback sebagai argumen ketiga, atau Anda bisa menggunakan janji yang dikembalikan.
Leonid Beschastny
@LeonidBeschastny Saya mencoba ini. Dalam kasus saya, saya memiliki banyak dokumen dengan kunci yang sama. Saya ingin $ menarik semua dokumen ini tetapi kueri saat ini hanya mengubah 1 dokumen dan kemudian berhenti. Perubahan apa yang saya butuhkan?
Shubham A.
1
@Shubham. secara default .update()memperbarui satu dokumen. Untuk memperbarui beberapa dokumen, gunakan { multi: true }opsi. Lihat db.collection.updatedokumen untuk detailnya .
Leonid Beschastny
14

Kode di bawah ini akan menghapus elemen objek lengkap dari array, di mana nomor teleponnya adalah '+1786543589455'

db.collection.update(
  { _id: id },
  { $pull: { 'contact': { number: '+1786543589455' } } }
);
chirag jain
sumber
4

Dalam bahasa Mongoose: dari dokumen :

Untuk menghapus dokumen dari larik subdocument, kita dapat mengirimkan objek dengan _id yang cocok.

contact.phone.pull({ _id: itemId }) // remove
contact.phone.pull(itemId); // this also works

Lihat jawaban Leonid Beschastny untuk jawaban yang benar.

Md Alamin
sumber
3

Anda cukup menggunakan $ pull untuk menghapus sub-dokumen. Operator $ pull menghapus semua instance dari nilai atau nilai yang cocok dengan kondisi tertentu dari array yang ada.

Collection.update({
    _id: parentDocumentId
  }, {
    $pull: {
      subDocument: {
        _id: SubDocumentId
      }
    }
  });

Ini akan menemukan dokumen induk Anda terhadap ID yang diberikan dan kemudian akan menghapus elemen dari subDocument yang cocok dengan kriteria yang diberikan.

Baca lebih lanjut tentang tarik di sini .

Syeda Aimen Batool
sumber
0

Jika Anda menggunakan Mongoose API dan ingin menarik objek sub / anak: Baca dokumen ini Jangan lupa untuk menggunakan save () setelah Anda selesai mengedit jika tidak, perubahan tidak akan disimpan ke database.

NonameLover
sumber