Mongodb'da dizi elemanı nasıl kaldırılır?


130

İşte dizi yapısı

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

    ]
}

Burada yalnızca mongo kimliğini ( _id) ve telefon numarasını ( +1786543589455) biliyorum ve ilgili tüm dizi öğesini belgeden kaldırmam gerekiyor. ör. telefon dizisindeki sıfır dizinli öğe, telefon numarasıyla eşleşir ve karşılık gelen dizi öğesini kaldırması gerekir.

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

Aşağıdaki güncelleme yöntemini denedim

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

Ancak number: +1786543589455, telefon dizisindeki sıfır dizinli öğeyi değil, iç dizi nesnesinden kaldırır . pullBaşarısız olarak da denendi .

Mongodb'da dizi elemanı nasıl kaldırılır?

Yanıtlar:


238

Aşağıdaki sorguyu deneyin:

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

Bu verilen belgeyi bulacaksınız _idve telefonu kaldırmak +1786543589455onun gelen contact.phonediziden.

$unsetDizideki değeri geri almak için kullanabilirsiniz (olarak ayarlayın null), ancak tamamen kaldırmak için kullanamazsınız.


3
Teşekkür ederim. Güzel çalışıyor. Başarılı { $pull: { 'contact.phone.$': { 'contact.phone.$.number': '+1786543589455' } } }olup { $pull: { 'contact.phone': { 'contact.phone.$.number': '+1786543589455' } } }olmadığını denedim . Burada konum operatörlerinin çalışmasını anlamıyor mu?
Justin John

1
Bununla geri arama var mı?
Oliver Dixon

1
@iLoveUnicorns, üçüncü bir argüman olarak bir geri arama ekleyebilir veya döndürülen sözü kullanabilirsiniz.
Leonid Beschastny

@LeonidBeschastny bunu denedim. Benim durumumda, aynı anahtara sahip birden fazla belgem var. Tüm bu belgeleri $ çekmek istiyorum ama mevcut sorgu yalnızca 1 belgeyi değiştiriyor ve sonra duruyor. Ne tür değişikliklere ihtiyacım var?
Shubham A.

1
@ShubhamA. varsayılan olarak .update()tek bir belgeyi günceller. Birden fazla belgeyi güncellemek için { multi: true }seçeneği kullanın. Ayrıntılar için db.collection.updatebelgelere bakın .
Leonid Beschastny

14

Aşağıdaki kod, telefon numarasının '+1786543589455' olduğu diziden tüm nesne öğesini kaldıracaktır.

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

4

Mongoose'da: belgeden :

Bir alt belge dizisinden bir belgeyi kaldırmak için, eşleşen bir _id ile bir nesne iletebiliriz.

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

Doğru cevap için Leonid Beschastny'nin cevabına bakın.


3

Bir alt belgeyi kaldırmak için $ pull kullanabilirsiniz. $ Çekme operatörü, var olan bir diziden, belirli bir koşulla eşleşen bir değerin veya değerlerin tüm örneklerini kaldırır.

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

Bu, verilen kimliğe göre ana belgenizi bulacak ve ardından, verilen kriterlere uyan öğeyi alt belgeden kaldıracaktır.

Buradan çekme hakkında daha fazla bilgi edinin .


0

Mongoose API'sini kullanıyorsanız ve bir alt / alt nesne çekmek istiyorsanız: Bu belgeyi okuyun Düzenlemeyi bitirdiğinizde save () kullanmayı unutmayın, aksi takdirde değişiklikler veritabanına kaydedilmez.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.