Wie entferne ich ein Feld vollständig aus einem MongoDB-Dokument?


307
{ 
    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
     }
}

Antworten:


532

Versuchen Sie Folgendes: Wenn Ihre Sammlung ein Beispiel war

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

Verweisen Sie darauf:

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

UPDATE :

Der obige Link behandelt nicht länger '$ unset'ing'. Stellen Sie sicher, {multi: true}dass Sie hinzufügen, wenn Sie dieses Feld aus allen Dokumenten in der Sammlung entfernen möchten. Andernfalls wird es nur aus dem ersten Dokument entfernt, das übereinstimmt. Eine aktualisierte Dokumentation finden Sie hier:

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

Beispiel:

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

1
Siehe die Lösung für diese Frage zur Erklärung von false / true stackoverflow.com/questions/7714216/…
Dsel

1
Es gibt keinen Kommentar mehr von einem "Nic Cottrell" auf dieser Seite :)
Dan Dascalescu

6
Vermisse ich etwas oder ist das seit mehr als 8 Jahren falsch, tags.wordssollte es $unsetnicht sein words? Siehe auch Salvador Dalis Antwort.
Dan Dascalescu

1
Sie können auch updateManyanstelle von {multi:true}, dhdb.example.updateMany({},{"$unset":{words:""}})
Kip

158

Am Anfang habe ich nicht verstanden, warum die Frage eine Prämie hat (ich dachte, dass die Frage eine nette Antwort hat und es nichts hinzuzufügen gibt), aber dann bemerkte ich, dass die Antwort, die 15 Mal akzeptiert und positiv bewertet wurde, tatsächlich falsch war!

Ja, Sie müssen den $unsetOperator verwenden , aber durch dieses Deaktivieren wird der Wortschlüssel entfernt, der für ein Dokument für eine Sammlung nicht vorhanden ist. Im Grunde wird es also nichts tun.

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

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

Nur zur Vervollständigung werde ich auf eine andere Art und Weise verweisen , die viel schlimmer ist, aber auf diese Weise können Sie das Feld mit jedem benutzerdefinierten Code ändern (sogar basierend auf einem anderen Feld aus diesem Dokument).


2
Wenn tags ein Array ist, sieht es außerdem so aus: db.example.update ({}, {$ unset: {'tags. $ []. Words': 1}}, false, true)
Manan Shah

21
db.example.updateMany({},{"$unset":{"tags.words":1}})

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


2
Ich finde das klarer als die false, trueletzten beiden Argumente anupdate()
Kip

17

So entfernen oder löschen Sie Felder in MongoDB

  • Für einzelne Aufnahme

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

    db.getCollection('userData').update({}, {$unset: {pi: 1}}, {multi: true})

2

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, und dies war der erste Beitrag, auf den ich gestoßen bin. Ich dachte, ich würde ihn hier für alle anderen veröffentlichen, die versuchen, dasselbe zu tun.

Nehmen wir stattdessen an, Ihre Daten sehen 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 wordsaus dem eingebetteten Dokument zu entfernen :

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

oder mit dem updateMany

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

Das $unsetbearbeitet es nur, wenn der Wert vorhanden ist, führt jedoch keine sichere Navigation durch (es wird nicht überprüft, ob tagses zuerst vorhanden ist), sodass das vorhandene im eingebetteten Dokument benötigt wird.

Dies verwendet den Operator all positional ( $[]), der in Version 3.6 eingeführt wurde


1

Standardmäßig aktualisiert die update () -Methode ein einzelnes Dokument. Stellen Sie den Multi-Parameter ein, 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 Ihrem Beispiel:

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

1

Ab dem Start Mongo 4.2kann 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 Aktualisierungsmethode kann auch eine Aggregationspipeline akzeptieren (beachten Sie die eckigen Klammern, die die Verwendung einer Aggregationspipeline angeben).

Dies bedeutet, dass der verwendete $unsetOperator der Aggregationsoperator ist (im Gegensatz zum "Abfrage" -Operator ), dessen Syntax ein Array von Feldern verwendet.


1

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

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

0

Und für Mongomapper,

  • Dokument: Abschaltung
  • Zu entfernendes Feld: shutoff_type

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


0

Da ich diese Seite immer wieder gefunden habe, als ich nach einer Möglichkeit gesucht habe, ein Feld mit MongoEngine zu entfernen, ist es möglicherweise hilfreich, die MongoEngine-Methode auch hier zu veröffentlichen:

Example.objects.all().update(unset__tags__words=1)

-2

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

Ans:

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


-3

Überprüfen Sie, ob "Wörter" vorhanden sind, und entfernen Sie sie dann aus dem Dokument

    db.users.update({"tags.words" :{$exists: true}},
                                           {$unset:{"tags.words":1}},false,true);

true bedeutet, dass mehrere Dokumente aktualisiert werden, wenn sie übereinstimmen.


Sie müssen nicht auf Existenz prüfen. In der Dokumentation heißt es: "Wenn das Feld nicht vorhanden ist, führt $ unset nichts aus (dh keine Operation)."
Dan Dascalescu

-4

Sie können dies auch in Aggregation tun, indem Sie das Projekt unter 3.4 verwenden

{$ project: {"tags.words": 0}}


-7

Versuchen Sie dies, um auf ein Paket zu verweisen und verschiedene "Schlüssel" zu entfernen

db['name1.name2.name3.Properties'].remove([
{
     "key" : "name_key1"
},
{
     "key" : "name_key2"
},
{
     "key" : "name_key3"
}
)]
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.