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?

Justin John
quelle

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.

Leonid Beschastny
quelle
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' } } }
);
Chirag Jain
quelle
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.

Md Alamin
quelle
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 .

Syeda Aimen Batool
quelle
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.

NonameLover
quelle