Antworten:
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});
tags.words
sollte es $unset
nicht sein words
? Siehe auch Salvador Dalis Antwort.
updateMany
anstelle von {multi:true}
, dhdb.example.updateMany({},{"$unset":{words:""}})
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 $unset
Operator 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).
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})
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 words
aus 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 $unset
bearbeitet es nur, wenn der Wert vorhanden ist, führt jedoch keine sichere Navigation durch (es wird nicht überprüft, ob tags
es 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
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})
Ab dem Start 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 Aktualisierungsmethode kann auch eine Aggregationspipeline akzeptieren (beachten Sie die eckigen Klammern, die die Verwendung einer Aggregationspipeline angeben).
Dies bedeutet, dass der verwendete $unset
Operator der Aggregationsoperator ist (im Gegensatz zum "Abfrage" -Operator ), dessen Syntax ein Array von Feldern verwendet.
Die Lösung für PyMongo (Python Mongo):
db.example.update({}, {'$unset': {'tags.words':1}}, multi=True);
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)
{name: 'book', tags: {words: ['abc', '123'], lat: 33, long: 22}}
Ans:
db.tablename.remove ({'tags.words': ['abc', '123']})
Ü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.