Wie entferne ich ein Array-Element in Mongodb?


129

Hier ist die Array-Struktur

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

    ]
}

Hier kenne ich nur die Mongo-ID ( _id) und die Telefonnummer ( +1786543589455) und muss das gesamte entsprechende Array-Element aus dem Dokument entfernen. Das heißt, das nullindizierte Element im Telefonarray stimmt mit der Telefonnummer überein und muss das entsprechende Arrayelement entfernen.

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

Ich habe es mit der folgenden Update-Methode versucht

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

Es wird jedoch number: +1786543589455aus dem inneren Array-Objekt entfernt, nicht aus dem indizierten Element Null im Telefon-Array. Versucht mit pullauch ohne Erfolg.

Wie entferne ich das Array-Element in Mongodb?

Antworten:


237

Versuchen Sie die folgende Abfrage:

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

Es findet ein Dokument mit dem angegebenen _idund entfernt das Telefon +1786543589455aus seinem contact.phoneArray.

Sie können $unsetden Wert im Array deaktivieren (auf setzen null), ihn jedoch nicht vollständig entfernen.


3
Danke dir. Es funktioniert gut. Ich habe es mit { $pull: { 'contact.phone.$': { 'contact.phone.$.number': '+1786543589455' } } }und { $pull: { 'contact.phone': { 'contact.phone.$.number': '+1786543589455' } } }ohne Erfolg versucht . Versteht das Arbeiten von Positionsoperatoren hier nicht?
Justin John

1
Gibt es einen Rückruf damit?
Oliver Dixon

1
@iLoveUnicorns Sie können einen Rückruf als drittes Argument hinzufügen oder das zurückgegebene Versprechen verwenden.
Leonid Beschastny

@LeonidBeschastny Ich habe es versucht. In meinem Fall habe ich mehrere Dokumente mit demselben Schlüssel. Ich möchte alle diese Dokumente abrufen, aber die aktuelle Abfrage ändert nur 1 Dokument und stoppt dann. Welche Änderungen brauche ich?
Shubham A.

1
@ ShubhamA. Standardmäßig wird .update()ein einzelnes Dokument aktualisiert. Verwenden Sie die { multi: true }Option, um mehrere Dokumente zu aktualisieren . db.collection.updateEinzelheiten finden Sie in den Dokumenten .
Leonid Beschastny

14

Mit dem folgenden Code wird das gesamte Objektelement aus dem Array entfernt, wobei die Telefonnummer "+1786543589455" lautet.

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

4

Im Mungo: aus dem Dokument :

Um ein Dokument aus einem Subdokument-Array zu entfernen, übergeben wir möglicherweise ein Objekt mit einer übereinstimmenden _id.

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

Siehe Leonid Beschastnys Antwort für die richtige Antwort.


3

Sie können einfach $ pull verwenden, um ein Unterdokument zu entfernen. Der Operator $ pull entfernt aus einem vorhandenen Array alle Instanzen eines Werts oder von Werten, die einer bestimmten Bedingung entsprechen.

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

Dadurch wird Ihr übergeordnetes Dokument anhand der angegebenen ID gefunden und anschließend das Element aus dem Unterdokument entfernt, das den angegebenen Kriterien entspricht.

Lesen Sie mehr über Pull hier .


0

Wenn Sie die Mongoose-API verwenden und ein Unter- / Unterobjekt abrufen möchten: Lesen Sie dieses Dokument. Vergessen Sie nicht, save () zu verwenden, wenn Sie mit der Bearbeitung fertig sind. Andernfalls werden die Änderungen nicht in der Datenbank gespeichert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.