HOWTO · MongoDB
Verschachtelte Felder in MongoDB projizieren
Dieses Tutorial zeigt, wie Sie verschachtelte MongoDB-Felder mit Punktnotation und find() auswählen, Aggregationsergebnisse mit $project formen und Felder mit der Aggregationsstufe $unset entfernen.
Auf dieser Seite
MongoDB-Dokumente können eingebettete Dokumente enthalten, zum Beispiel ein address-Objekt in einem Benutzerdatensatz. Eine Projektion legt fest, welche Felder eine Abfrage zurückgibt. Wird etwa address.city ausgewählt, enthält das Ergebnis diesen verschachtelten Wert in seiner verschachtelten Struktur. Verwenden Sie eine Projektion mit find() für ein einfaches Abfrageergebnis, $project zum Formen von Dokumenten in einer Aggregationspipeline und $unset, wenn ausgewählte Felder aus Pipeline-Ergebnissen entfernt werden sollen.
Projektion verschachtelter Felder in MongoDB verstehen
Angenommen, ein Dokument enthält die Felder name und address, wobei address die Felder street, city und country enthält. Ein verschachtelter Pfad wird mit Punktnotation angegeben, zum Beispiel address.city. Eine Projektion verändert das zurückgegebene Dokument, nicht das gespeicherte Quelldokument. Die folgenden Beispiele verwenden dieselbe Struktur. Bei find()-Projektionen wird _id standardmäßig eingeschlossen, sofern es nicht ausdrücklich ausgeschlossen wird.
Verschachtelte Felder mit Punktnotation und find() auswählen
Um nur die Stadt aus der verschachtelten Adresse zurückzugeben, nehmen Sie ihren Pfad mit Punktnotation in die Projektion auf. Dieser MongoDB-Shell-Ausdruck veranschaulicht die Syntax und wird von der konfigurierten Laufzeit nicht ausgeführt:
db.users.find({}, { "address.city": 1, "_id": 0 })
Das zurückgegebene Dokument hat die Form { "address": { "city": "New York" } }. Lassen Sie _id: 0 weg, wenn die Kennung in jedem Ergebnis enthalten bleiben soll. Um einen verschachtelten Pfad auszuschließen und die übrigen Felder beizubehalten, verwenden Sie 0, zum Beispiel { "address.country": 0 }.
Eine Inklusionsprojektion kann im Allgemeinen nicht zugleich eingeschlossene und ausgeschlossene Felder enthalten. Die besondere Ausnahme ist _id: Dieses Feld darf ausgeschlossen werden, während andere Pfade eingeschlossen werden. Legen Sie für die übrigen Felder entweder eine Inklusions- oder eine Exklusionsprojektion fest.
Führen Sie dieses Beispiel aus:
Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.
document = {"name": "Ava", "address": {"city": "New York", "country": "USA"}}
result = {"address": {"city": document["address"]["city"]}}
print(result)
{'address': {'city': 'New York'}}
Dieses kleine Python-Beispiel veranschaulicht die Struktur des zurückgegebenen verschachtelten Werts; es stellt keine Verbindung zu MongoDB her. Die MongoDB-Abfrage oben verwendet den entsprechenden Pfad mit Punktnotation.
Mit der $project-Aggregationsstufe verschachtelte Felder formen
In einer Aggregationspipeline kann $project verschachtelte Pfade einschließen und Quellpfade Ausgabefeldern zuordnen. Das Beispiel { $project: { _id: 0, city: "$address.city", name: 1 } } gibt city auf der obersten Ebene neben name zurück. Eine direkte Aufnahme des Pfads, etwa { $project: { "address.city": 1, _id: 0 } }, behält dagegen die Verschachtelung von address.city bei. Deshalb eignet sich $project, wenn die Pipeline eine bestimmte Ausgabestruktur benötigt. Ausdrücke können außerdem Ausgabewerte berechnen; achten Sie darauf, dass sich jeder Ausdruck auf ein Feld bezieht, das in den Eingabedokumenten vorhanden ist.
Mit der $unset-Aggregationsstufe verschachtelte Felder ausschließen
Verwenden Sie die Aggregationsstufe $unset, um einen oder mehrere Pfade zu entfernen und die übrigen Felder beizubehalten: { $unset: ["address.country"] }. Ein Pfad mit Punktnotation entfernt das angegebene verschachtelte Feld aus dem Pipeline-Ergebnis. $unset legt fest, welche Felder in der Pipeline weitergereicht werden; Dokumente werden dadurch nicht herausgefiltert. Verwenden Sie zum Filtern von Dokumenten stattdessen eine Abfragebedingung oder die Stufe $match. Diese Stufe gehört zur Aggregation und ist vom Aktualisierungsoperator gleichen Namens zu unterscheiden.
Zwischen Abfrageprojektion und Aggregation wählen
Verwenden Sie find() mit Punktnotation, wenn eine Abfrage lediglich Felder in den zurückgegebenen Dokumenten ein- oder ausschließen soll. Wählen Sie $project, wenn eine Aggregation Pfade umbenennen, Werte berechnen oder eine gezielte Ausgabestruktur festlegen muss. $unset eignet sich, wenn die Pipeline die meisten Felder beibehalten und nur einige entfernen soll. $addFields fügt Felder hinzu oder ersetzt sie, während die übrigen Felder jedes Dokuments erhalten bleiben; es ist daher kein Ersatz für eine Projektion zur Feldauswahl. In allen drei Fällen verändern Projektion und Feldformung die Ergebnisse, nicht die gespeicherten Dokumente.