Jak usunąć element tablicy w mongodb?


129

Oto struktura tablicy

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

    ]
}

Tutaj znam tylko identyfikator mongo ( _id) i numer telefonu ( +1786543589455) i muszę usunąć cały odpowiedni element tablicy z dokumentu. tzn. element indeksowany przez zero w tablicy phone jest dopasowywany do numeru telefonu i trzeba usunąć odpowiedni element tablicy.

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

Próbowałem z następującą metodą aktualizacji

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

Ale usuwa number: +1786543589455z wewnętrznej tablicy obiekt, a nie element indeksowany przez zero w tablicy phone. Próbowałem pullteż bez powodzenia.

Jak usunąć element tablicy w mongodb?

Odpowiedzi:


237

Spróbuj wykonać następujące zapytanie:

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

Znajdzie dokument z podanym _idi usunie telefon +1786543589455ze swojej contact.phonetablicy.

Możesz użyć $unsetdo usunięcia wartości w tablicy (ustawić ją na null), ale nie do całkowitego usunięcia.


3
Dziękuję Ci. Działa fajnie. Próbowałem z sukcesem { $pull: { 'contact.phone.$': { 'contact.phone.$.number': '+1786543589455' } } }i { $pull: { 'contact.phone': { 'contact.phone.$.number': '+1786543589455' } } }bez niego. Nie rozumiesz tutaj działania operatorów pozycyjnych?
Justin John

1
Czy jest oddzwonienie z tym?
Oliver Dixon

1
@iLoveUnicorns możesz dodać callback jako trzeci argument lub możesz użyć zwróconej obietnicy.
Leonid Beschastny

@LeonidBeschastny Próbowałem tego. W moim przypadku mam wiele dokumentów z tym samym kluczem. Chcę pobrać wszystkie te dokumenty, ale bieżące zapytanie zmienia tylko 1 dokument, a następnie zatrzymuje się. Jakich zmian potrzebuję?
Shubham A.

1
@ShubhamA. domyślnie .update()aktualizuje pojedynczy dokument. Aby zaktualizować wiele dokumentów, użyj { multi: true }opcji. Zobacz db.collection.updatedokumentację, aby uzyskać szczegółowe informacje .
Leonid Beschastny

14

Poniższy kod usunie cały element obiektu z tablicy, gdzie numer telefonu to „+1786543589455”

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

4

W Mongoose: z dokumentu :

Aby usunąć dokument z tablicy poddokumentów, możemy przekazać obiekt z pasującym identyfikatorem _id.

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

Zobacz odpowiedź Leonida Beschastnego, aby uzyskać poprawną odpowiedź.


3

Możesz po prostu użyć $ pull, aby usunąć dokument podrzędny. Operator $ pull usuwa z istniejącej tablicy wszystkie wystąpienia wartości lub wartości, które pasują do określonego warunku.

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

Spowoduje to wyszukanie Twojego dokumentu nadrzędnego na podstawie podanego ID, a następnie usunie element z podDokumentu, który spełnia podane kryteria.

Przeczytaj więcej o ciągnięciu tutaj .


0

Jeśli używasz interfejsu API Mongoose i chcesz pobrać obiekt podrzędny / podrzędny: Przeczytaj ten dokument Nie zapomnij użyć funkcji save () po zakończeniu edycji, w przeciwnym razie zmiany nie zostaną zapisane w bazie danych.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.