{
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
}
}
mongodb
mongodb-query
database
TIMEX
quelle
quelle
tags.words
sollte es$unset
nicht seinwords
? 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.
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).
quelle
Wir können dies auch verwenden, um mehrere Dokumente zu aktualisieren.
quelle
false, true
letzten beiden Argumente anupdate()
So entfernen oder löschen Sie Felder in MongoDB
Für einzelne Aufnahme
Für Multi Record
quelle
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:
Gehen Sie folgendermaßen vor, um die Spalte
words
aus dem eingebetteten Dokument zu entfernen :oder mit dem
updateMany
Das
$unset
bearbeitet es nur, wenn der Wert vorhanden ist, führt jedoch keine sichere Navigation durch (es wird nicht überprüft, obtags
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 wurdequelle
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 :
Beispiel:
In Ihrem Beispiel:
quelle
Ab dem Start
Mongo 4.2
kann auch eine etwas andere Syntax verwendet werden: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.quelle
Die Lösung für PyMongo (Python Mongo):
quelle
Und für Mongomapper,
Shutoff.collection.update( {}, { '$unset' => { 'shutoff_type': 1 } }, :multi => true )
quelle
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:
quelle
{name: 'book', tags: {words: ['abc', '123'], lat: 33, long: 22}}
Ans:
db.tablename.remove ({'tags.words': ['abc', '123']})
quelle
Überprüfen Sie, ob "Wörter" vorhanden sind, und entfernen Sie sie dann aus dem Dokument
true bedeutet, dass mehrere Dokumente aktualisiert werden, wenn sie übereinstimmen.
quelle
Sie können dies auch in Aggregation tun, indem Sie das Projekt unter 3.4 verwenden
{$ project: {"tags.words": 0}}
quelle
Versuchen Sie dies, um auf ein Paket zu verweisen und verschiedene "Schlüssel" zu entfernen
quelle