MongoDB-Projektion und Projektionsoperatoren erklärt

MongoDB-Projektion und Projektionsoperatoren erklärt

  • Orchestrierung
6 Minuten Lesezeit Aktualisiert Nov 24, 2020

Auf einen Blick: Die MongoDB-Projektion ermöglicht es Nutzern, gezielt bestimmte Felder aus Dokumenten abzurufen, was das Datenmanagement und die Leistung verbessert. Sie nutzt Operatoren wie $elemMatch, $slice und $meta für maßgeschneiderte Datenextraktion.

  • Projektion reduziert den Ressourcenverbrauch während Abfragen.
  • Operatoren bieten fortschrittliche Funktionen für die spezifische Datenabrufe.

In MongoDB verwenden wir die find()- Methode, um Daten abzurufen. Find() ruft jedoch alle Felder in einem Dokument ohne jegliche Filterung ab. Die MongoDB-Projektion löst dieses Problem, indem die find()-Funktion mit Datenfilterargumenten verwendet werden kann, die es den Nutzern ermöglichen, nur die notwendigen Datenfelder aus einem Dokument zu extrahieren. In diesem praktischen Artikel zeigen wir Ihnen:

Wie die MongoDB-Projektion funktioniert

MongoDB-Projektion ist ein leistungsstarkes Werkzeug, das verwendet werden kann, um nur die benötigten Felder aus einem Dokument zu extrahieren – nicht alle Felder. Sie ermöglicht es Ihnen:

  • Projektspezifische und transparente Daten
  • Filtere den Datensatz, ohne die Gesamtleistung der Datenbank zu beeinträchtigen

Da die MongoDB-Projektion auf der bestehenden find()- Methode aufbaut, können Sie jede Projektionsanfrage ohne wesentliche Änderungen an den bestehenden Funktionen verwenden. Außerdem ist Projektion ein entscheidender Faktor beim Finden benutzerspezifischer Daten aus einem bestimmten Datensatz.

Grundlegende Syntax der MongoDB-Projektion

    db.collection_name.find({},{ : })

Die MongoDB-Projektion verwendet dieselbe Suchsyntax, aber wir fügen der Suchfunktion auch eine Menge von Parametern hinzu. Diese Parametermenge informiert die MongoDB-Instanz, welche Felder zurückgegeben werden sollen. Betrachten Sie die folgende Sammlung namens "vehicleinformation"

Wir werden versuchen, das Modelljahr des Fahrzeugs zu ermitteln. Toyota (Marke: 'Toyota') Normale find()-Aussage

    db.vehicleinformation.find({make : "Toyota"}).pretty()

Ergebnis:

In dieser Erklärung erhalten wir alle Daten im Dokument, wobei die Marke Toyota ist. Um nur das Jahr zu erhalten, können wir die Prognose verwenden, wie unten gezeigt. MongoDB-Projektionsanweisung

    db.vehicleinformation.find({make : "Toyota"}, {year : 1}).pretty()

Ergebnis:

In der Projektionsanweisung verwenden wir das Jahrfeld mit dem Boolesche Wert 1 (True), um anzuzeigen, dass wir nur das Feld "Jahr" benötigen. Die Einschränkung ist, dass MongoDB die Objekt-ID (_id) jedes Dokuments zurückgibt, es sei denn, wir geben ausdrücklich an, dass wir die Objekt-ID nicht benötigen. MongoDB-Projektionsanweisung mit "_id" ausgeschlossen

    db.vehicleinformation.find({make : "Toyota"}, {year : 1, _id : 0}).pretty()

Ergebnis:

In dieser Anweisung geben wir 0 als Boolesche Operator, um anzuzeigen, dass wir das Objekt-ID-Feld nicht benötigen.

Operatoren in der MongoDB-Projektion

Die Verwendung der MongoDB-Projektionsmethode zur Abrufung spezifischer Daten aus einem Dokument wirkt sich positiv auf die Datenbankleistung aus, da sie die Arbeitslast der Suchanfrage reduziert und den Ressourcenverbrauch minimiert. Um die Arbeitslast zu reduzieren, bietet MongoDB folgende Operatoren an, die innerhalb einer Projektionsanfrage verwendet werden können:

  • $
  • $elemMatch
  • $slice
  • $meta

$ Operator

Der $-Operator wird verwendet, um den Inhalt eines Arrays zu begrenzen und das erste Element zu projizieren, das der Abfragebedingung entspricht, auf dem Array-Feld. Ab MongoDB 4.4 wird das erste Element im angegebenen Array zurückgegeben, wenn keine Abfragebedingung vorhanden ist. Syntax:

    db.collection.find( { :  ... }, { ".$": 1 } )

Einschränkungen des $-Operators:

  • Nur ein einziger $-Operator kann in einer einzigen Abfrage verwendet werden.
  • Die Abfrage darf nur aus einer einzigen Bedingung auf dem Array-Feld bestehen, in dem sie angewendet werden soll.
  • Die Sort()-Funktion in der find()-Methode wird vor dem $ Operator angewendet. Diese Funktion kann dazu führen, dass die Sortierreihenfolge nicht korrekt dargestellt wird.
  • Der $-Operator kann nur am Ende eines Feldpfads angewendet werden. Diese Einschränkung wurde in MongoDB 4.4 eingeführt, um Formatierungsprobleme zu vermeiden.
  • Der $slice-Projektionsausdruck kann nicht mit dem Operator $ als Teil desselben Ausdrucks verwendet werden.

Wir werden die "studentgrades"-Sammlung verwenden, um den $-Operator zu demonstrieren.

    db.studentgrades.find({},{_id:0}).pretty()

Ergebnis:

Mit der Sammlung "studentgrades" suchen wir, ob ein Schüler Noten von 80 oder höher erhalten hat. Schauen wir uns an, was passiert, wenn wir den $-Operator nicht verwenden. Der untenstehende Code führt dazu, dass die Abfrage alle Werte im Array als Ausgabe zurückgibt, wenn ein Element gleich oder größer als 80 ist.

    db.studentgrades.find( {grades: { $gte: 80}}, {"grades": 1})

Ergebnis:

Mit dem Operator $ wird nur das erste Element zurückgegeben, wenn es gleich oder größer als 80 ist.

    db.studentgrades.find( {grades: { $gte: 80}}, {"grades.$": 1})

Ergebnis:

$elemMatch Operator

$elemMatch Operator begrenzt den Inhalt eines Arrays auf das erste Element, das einer gegebenen Bedingung entspricht. Diese Bedingung unterscheidet sich vom $-Operator, da der $elemMatch-Projektionsoperator ein explizites Bedingungsargument erfordert. Schauen wir uns die Syntax der Verwendung von $elemMatch in find()-Methode an. Syntax:

    db.collection.find( { :  ... }, { ".$elemMatch": ($elemMatch operator) } )

Einschränkungen des $elemMatch-Operators

  • Unabhängig von der Reihenfolge der Felder im Dokument wird das Feld, auf das $elemMatch Projektion angewendet wird, als letztes Feld des Dokuments zurückgegeben.
  • find()-Operationen, die auf MongoDB-Views durchgeführt werden, unterstützen $elemMatch Projektionsoperator nicht.
  • $text Abfrageausdrücke werden mit dem $elemMatch-Operator nicht unterstützt.

Wir verwenden die folgende "Schooldata"-Sammlung, um den $elemMatch Operator zu demonstrieren.

    db.schooldata.find()

Ergebnis:

Jetzt führen wir das auf einem einzigen Feld aus. Mit dem $elemMatch-Operator suchen wir nach Schulen in London mit Schülern, die zehn Jahre alt sind. Die Pretty()-Methode wird verwendet, um die Ausgabe zu formatieren.

    db.schooldata.find({address: "London"}, {"students" : {$elemMatch: {"age": "10"}}}).pretty()

Ergebnis:

Im untenstehenden Beispiel prüfen wir mehrere Felder. Hier prüfen wir sowohl das Alter als auch den Namen der Schüler. Wir prüfen, ob ein Schüler namens "Barry", der zehn Jahre alt ist, eine Schule in London besucht.

    db.schooldata.find({address: "London"}, {"students" : {$elemMatch: {name: "barry", "age": "10"}}}).pretty()

Ergebnis:

$slice Projektionsoperator

Der $slice-Operator gibt die Anzahl der Elemente an, die als Ausgabe einer Abfrage zurückgegeben werden sollen. Syntax:

    db.collection.find( ,  { : { $slice:  } })

Einschränkungen $slice Operator:

  • Mit der Einführung von MongoDB 4.4 gibt der $slice-Operator nur das geschnittene Element zurück. Er gibt kein anderes Element in einem verschachtelten Array zurück.
  • Der $slice-Operator unterstützt die Find()-Operation, die auf MongoDB-Ansichten durchgeführt wird, nicht.
  • Der $slice-Operator kann aufgrund der MongoDB-Einschränkung nicht zusammen mit dem $-Projektionsoperator verwendet werden, wobei oberste Felder nicht aus $ (Dollarzeichen) als Teil des Feldnamens bestehen dürfen.
  • Abfragen können nicht die $slice eines Arrays und eines im Array eingebetteten Feldes als Teil derselben Anweisung enthalten, um Pfadkollisionen aus MongoDB 4.4 zu eliminieren.

Nun verwenden wir die "schooldata"-Sammlung, um den $slice-Operator zu demonstrieren.

    db.schooldata.find()

Ergebnis:

Schneiden wir das erste Element in einem Array. Um dieses Ergebnis zu erzielen, verwenden wir den $slice-Operator, um nur das erste Element aus dem Array des Schülers zu schneiden.

    db.schooldata.find({}, {students: {$slice : 1}})

Ergebnis:

Jetzt schneiden wir das letzte Element im Array. Verwenden Sie den $slice-Operator mit "-1", um den letzten Datensatz anzuzeigen.

    db.schooldata.find({}, {students: {$slice : -1}})

Ergebnis:

Um Elemente zu überspringen, müssen wir die zu überspringenden Elemente und die Anzahl der zurückgegebenen Elemente definieren. Die folgenden Beispiele demonstrieren dieses Szenario. Überspringen Sie das erste Element und geben Sie die nächsten beiden Elemente zurück:

    db.schooldata.find({}, {students: {$slice : [1, 2]}})

Ergebnis:

In dieser Anweisung schneiden wir das "Schüler"-Array, indem wir das erste Element überspringen und die verbleibenden beiden Elemente zurückgeben. Diese wurden innerhalb der eckigen Klammern [] definiert. Der erste Wert ist das zu ignorierende Element, während der zweite Wert angibt, wie viele verbleibende Elemente zurückgegeben werden sollen. Wenn das Array nach dem Überspringen des ersten Elements weniger als zwei Elemente hat, gibt es alle verbleibenden Elemente zurück.

$meta Operator

Der $meta-Operator wird verwendet, um die mit einem Dokument verbundenen Metadaten zu erhalten. Der $meta-Operator kann sowohl mit MongoDB-Aggregation als auch MongoDB-Projektion verwendet werden. Dieser Abschnitt behandelt nur die Grundlagen der MongoDB-Projektion und wie der $meta-Operator in der Projektion verwendet wird. Der $meta-Operator verwendet folgende Syntax.

    { $meta:  }

Für das "metaDataKeyword" können Sie folgende Werte zuordnen:

  • "textScore"-Schlüsselwort. Das "textScore" liefert die mit der gegebenen $text Zeichenkette verbundene Wertzahl. Dieses Schlüsselwort findet im Wesentlichen heraus, wie genau der Suchbegriff mit dem gegebenen Feld in einem Dokument übereinstimmt. $text Abfrage ist bei Verwendung des Schlüsselworts "textScore" aus MongoDB 4.4 verpflichtend.
  • "indexKey"-Schlüsselwort. Eingeführt in MongoDB 4.4 als bevorzugte Alternative zur cursor.returnKey()-Funktion. Diese Funktion gibt einen Indexschlüssel für ein Dokument zurück, in dem ein nicht-textbasierter Index verwendet wird. Dieses Schlüsselwort dient ausschließlich Debugging-Zwecken und darf nicht in Produktionsumgebungen verwendet werden.

Verwendung und Einschränkungen $meta Operators in der Projektion:

  • Der Ausdruck {$meta: "$textScore"} kann Teil einer Projektionsabfrage in einem Dokument sein, um den Textwert zu erhalten. Der Ausdruck kann entweder eine Inklusion oder ein Ausschluss in der Projektionsanweisung sein. Die einzige Einschränkung besteht darin, dass, wenn der Ausdruck auf ein bestehendes Feld im Dokument gesetzt wird, der projizierte Metadatenwert den aktuellen Wert im Feld überschreibt.
  • Man kann den "Textscore" in der find()-Methode nicht definieren. Daher ist die beste Wahl, die MongoDB-Aggregation zu verwenden.
  • Der $meta-Ausdruck kann innerhalb einer Sort()-Funktion verwendet werden. Die Metadaten "textScore" werden in absteigender Reihenfolge sortiert.
  • Wenn der Ausdruck {$meta: "$textScore"} sowohl in der Projektions- als auch in der Sortierfunktion enthalten ist, kann jede Funktion unterschiedliche Feldnamen für den Ausdruck haben. Das Abfragesystem ignoriert den Feldnamen in sort().

Schauen wir uns nun einige Beispiele an: Für {$meta : "textScore"} verwenden wir die Lebensmittelsammlung.

    db.food.find().pretty()

Ergebnis:

Lassen Sie uns einen Index für die "Lebensmittel"-Sammlung erstellen. Wir werden das Feld "food_desc" verwenden, um einen Textindex zu erstellen.

    db.food.createIndex({"food_desc": "text"})

Ergebnis:

Finden wir nun den Textscore. Wir verwenden das Wort "pizza" als Suchbegriff und verwenden den $meta-Operator, um die Textwertung für jedes der Dokumente zu erhalten. Das  Feld (_id: 0) wird verwendet, um die Objekt-ID jedes Dokuments wegzulassen und eine übersichtlichere Ausgabe zu erhalten.

    db.food.find( {$text : {$search: "pizza"}}, {score: {$meta: "textScore"}, _id: 0})

Ergebnis:

Nun zu {$meta: "indexKey"}. Da "indexKey" ausschließlich zu Debugging-Zwecken gedacht ist, steht in der offiziellen MongoDB-Dokumentation Folgendes.

    NOTE
The { $meta: "indexKey" } expression is for debugging purposes only and not for application logic. MongoDB returns the value associated with the index chosen by the query system. The system can choose a different index upon subsequent execution.
For the selected index, the return value depends on how the database decides to represent values in an index and may change across versions. The represented value may not be the actual value for the field.

Die folgenden Beispiele werden mit der Sammlung "vehiclesales" erstellt. Mit dem Feld {_id:0} werden Objekt-IDs aus der Ausgabe weggelassen.

    db.vehiclesales.find({},{_id:0})

Ergebnis:

Hier erstellen wir einen zusammengesetzten Index mit den Feldern "make" und "type".

    db.vehiclesales.createIndex({make : 1, type: 1})

Ergebnis:

Als Nächstes machen wir eine Projektion mit einem Index. Wir suchen nach Dokumenten in der "vehiclesales"-Sammlung, bei denen der Typ gleich "Sport" ist, und verwenden den $meta-Operator, um den Indexschlüssel für jedes Dokument zu erhalten.

    db.vehiclesales.find({type: "Sports"},{idxKey: {$meta: "indexKey"}}).pretty()

Ergebnis:

Wie sieht es mit Projektionen ohne Index aus? Wenn wir ein Feld anfordern, das nicht Teil des Index ist, liefert die Abfrage keinen Wert, da der Index null ist. In diesem Fall wird der Index nicht zurückgegeben, da das Preisfeld kein Teil des Index ist.

    db.vehiclesales.find({price: {$gte: 47000}},{idxKey: {$meta: "indexKey"}}).pretty()

Ergebnis:

Damit ist dieses informative Tutorial abgeschlossen.

Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.

Mehr aus Orchestrierung

Interessieren Sie sich für mehr von BMC?

The Brief ist unsere monatliche E-Mail zum Mainframe und zur Enterprise-Orchestrierung: Recherchen, Kundenberichte, Produktnachrichten, Events.

Mit der Registrierung für dieses Angebot bestätigen Sie, dass Sie die Datenschutzrichtlinie von BMC gelesen und zugestimmt haben.

Sie haben The Brief abonniert

Das Briefing umfasst die Mainframe- und Enterprise-Orchestrierung – BMC AMI und Control-M – sowie die Analystenforschung, Kundeneinsätze und Events in beiden Bereichen.