480 Stimmen

Wie entfernt man ein Feld vollständig aus einem MongoDB-Dokument?

{ 
    name: 'book',
    tags: {
        words: ['abc','123'],
        lat: 33,
        long: 22
    }
}

Nehmen wir an, es handelt sich um ein Dokument. Wie entferne ich " words " vollständig aus allen Dokumenten dieser Sammlung entfernen? Ich möchte, dass alle Dokumente ohne " " sind. words ":

 { 
     name: 'book',
     tags: {
         lat: 33,
         long: 22
     }
}

20voto

Xavier Guihot Punkte 42435

Beginnend in Mongo 4.2 ist es auch möglich, eine etwas andere Syntax zu verwenden:

// { name: "book", tags: { words: ["abc", "123"], lat: 33, long: 22 } }
db.collection.updateMany({}, [{ $unset: ["tags.words"] }])
// { name: "book", tags: { lat: 33, long: 22 } }

Da die Update Methode eine Aggregationspipeline akzeptieren kann (beachten Sie die eckigen Klammern, die die Verwendung einer Aggregationspipeline anzeigen), bedeutet dies, dass die $unset Der hier verwendete Operator ist der Aggregationsoperator (im Gegensatz zum Operator "Abfrage" eine ), dessen Syntax ein Array von Feldern annimmt.

10voto

Yakir Tsuberi Punkte 1173

Die Lösung für PyMongo (Python mongo):

db.example.update({}, {'$unset': {'tags.words':1}}, multi=True);

9voto

Kaveh Naseri Punkte 705

Um ein Feld zu entfernen, können Sie diesen Befehl verwenden (dies wird auf alle Dokumente in der Sammlung angewendet):

db.getCollection('example').update({}, {$unset: {Words:1}}, {multi: true});

Und um mehrere Felder mit einem Befehl zu entfernen:

db.getCollection('example').update({}, {$unset: {Words:1 ,Sentences:1}}, {multi: true});

5voto

Jonathon Gardner Punkte 473

Ich habe versucht, etwas Ähnliches zu tun, aber stattdessen entfernen Sie die Spalte aus einem eingebetteten Dokument. Ich habe eine Weile gebraucht, um eine Lösung zu finden, und dies war der erste Beitrag, auf den ich gestoßen bin, also dachte ich, ich würde das hier für alle anderen posten, die dasselbe versuchen.

Nehmen wir also an, Ihre Daten sehen wie folgt aus:

{ 
  name: 'book',
  tags: [
    {
      words: ['abc','123'],
      lat: 33,
      long: 22
    }, {
      words: ['def','456'],
      lat: 44,
      long: 33
    }
  ]
}

So entfernen Sie die Spalte words aus dem eingebetteten Dokument zu entfernen, gehen Sie folgendermaßen vor:

db.example.update(
  {'tags': {'$exists': true}},
  { $unset: {'tags.$[].words': 1}},
  {multi: true}
)

oder über die updateMany

db.example.updateMany(
  {'tags': {'$exists': true}},
  { $unset: {'tags.$[].words': 1}}
)

En $unset nur bearbeiten, wenn der Wert vorhanden ist, aber es wird keine sichere Navigation durchgeführt (es wird nicht geprüft, ob tags exists first), so dass das exists für das eingebettete Dokument benötigt wird.

Dabei wird die alle positionalen Operatoren ( $[] ), die in Version 3.6 eingeführt wurde

3voto

Vince Punkte 676

En MongoDB-Shell könnte dieser Code hilfreich sein:

db.collection.update({}, {$unset: {fieldname: ""}} )

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X