it-swarm.com.de

So entfernen Sie ein Feld vollständig aus einem MongoDB-Dokument

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

Angenommen, dies ist ein Dokument. Wie entferne ich "words" vollständig aus allen Dokumenten in dieser Sammlung? Ich möchte, dass alle Dokumente ohne "words" sind:

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

Versuchen Sie folgendes: Wenn Ihre Sammlung "Beispiel" war

db.example.update({}, {$unset: {words:1}}, false, true);

Verweisen Sie dies:

http://www.mongodb.org/display/DOCS/Updating#Updating-%24unset

UPDATE

Der obige Link behandelt nicht mehr das '$ unset'. Fügen Sie unbedingt {multi: true} hinzu, wenn Sie dieses Feld aus allen Dokumenten in der Sammlung entfernen möchten. Andernfalls wird es nur aus dem ersten gefundenen Dokument entfernt, das gefunden wird. Hier finden Sie aktualisierte Dokumentation:

https://docs.mongodb.com/manual/reference/operator/update/unset/

Beispiel:

db.example.update({}, {$unset: {words:1}} , {multi: true});
411
Shaunak

Am Anfang habe ich nicht verstanden, warum die Frage eine Belohnung hat (ich dachte, dass die Frage eine schöne Antwort hat und nichts hinzuzufügen ist), aber dann bemerkte ich, dass die Antwort, die 15-mal akzeptiert wurde, tatsächlich falsch war!

Ja, Sie müssen $unset operator verwenden, aber diese Einstellung wird den Schlüssel "Schlüssel" entfernen, der für ein Dokument für eine Sammlung nicht vorhanden ist. Im Grunde wird es nichts tun.

Daher müssen Sie Mongo anweisen, in die Dokument-Tags und dann in die Wörter mit Punktnotation zu schauen. Die richtige Frage ist also.

db.example.update(
  {},
  { $unset: {'tags.words':1}},
  false, true
)

Zur Vervollständigung werde ich auf eine andere Möglichkeit, dies zu tun } verweisen, was viel schlimmer ist, aber auf diese Weise können Sie das Feld mit jedem benutzerdefinierten Code ändern (sogar basierend auf einem anderen Feld dieses Dokuments) .

135
Salvador Dali

So entfernen oder löschen Sie ein Feld in MongoDB

  • Für einen Datensatz 

    db.getCollection('userData').update({}, {$unset: {pi: 1}})
    
  • Für Multi Record 

    db.getCollection('userData').update({}, {$unset: {pi: 1}}, {multi: true})
    
16
Viral Patel
db.example.updateMany({},{"$unset":{"tags.words":1}})

Wir können dies auch verwenden, um mehrere Dokumente zu aktualisieren.

9
Vipul

Ab _Mongo 4.2_ kann auch eine etwas andere Syntax verwendet werden:

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

Die pdate -Methode kann auch eine Aggregationspipeline akzeptieren (beachten Sie die eckigen Klammern, die die Verwendung einer Aggregationspipeline kennzeichnen).

Dies bedeutet, dass der verwendete Operator $unset die Aggregation ist (im Gegensatz zum Operator "Abfrage" ), dessen Syntax ein Array von Feldern enthält.

1
Xavier Guihot

Ich habe versucht, etwas Ähnliches zu tun, aber stattdessen die Spalte aus einem eingebetteten Dokument zu entfernen. Es hat eine Weile gedauert, bis ich eine Lösung gefunden hatte. Dies war der erste Beitrag, auf den ich gestoßen bin, und ich dachte, ich würde ihn hier für alle anderen veröffentlichen, die das Gleiche versuchen.

Angenommen, Ihre Daten sehen stattdessen folgendermaßen aus:

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

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

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

oder mit der updateMany

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

Der $unset bearbeitet ihn nur, wenn der Wert vorhanden ist, führt jedoch keine sichere Navigation durch (es wird nicht geprüft, ob tags zuerst vorhanden ist), sodass der vorhandene Code im eingebetteten Dokument benötigt wird.

Hierfür wird der in Version 3.6 eingeführte all positional Operator ($[]) verwendet

1

Und für Mongomapper,

  • Dokument: Abschaltung
  • Zu entfernendes Feld: shutoff_type

Shutoff.collection.update( {}, { '$unset' => { 'shutoff_type': 1 } }, :multi => true )

0
Jon Kern

Standardmäßig aktualisiert die update () -Methode ein einzelnes Dokument. Legen Sie den Multi-Parameter fest, um alle Dokumente zu aktualisieren, die den Abfragekriterien entsprechen.

In Version 3.6 geändert . Syntax: 

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ]
   }
)

Beispiel:

db.getCollection('products').update({},{$unset: {translate:1, qordoba_translation_version:1}}, {multi: true})

In deinem Beispiel:

db.getCollection('products').update({},{$unset: {'tags.words' :1}},  {multi: true})
0
Amitesh

{ Name: 'Buch', Stichworte: { Wörter: ['abc', '123'], lat: 33, lang: 22 } }

Ans:

db.tablename.remove ({'tags.words': ['abc', '123']})

0
Poonam Agrawal