MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

$projection gegen $elemMatch

Der Unterschied in der Projektionsnutzung ist etwas subtil. In Ihrer Beispielverwendung sollten dies gleichwertige Abfragen (in Bezug auf die Indexverwendung) sein, aber $elemMatch Beispiel wiederholt unnötigerweise die Abfragekriterien. Der $ Projektion wäre für dieses Beispiel die sinnvollere Wahl.

Ein wesentlicher Unterschied, der in der Dokumentation erwähnt wird, ist das Array Feldbegrenzung für $ Projektionen:

Einige weitere Anmerkungen zu den Unterschieden in den Projektionsoperatoren weiter unten ...

Der Positionsname ($ ) Projektionsoperator :

  • begrenzt den Inhalt eines Array-Felds, das in den Abfrageergebnissen enthalten ist, auf das erste Element, das mit dem Abfragedokument übereinstimmt.

  • erfordert, dass das übereinstimmende Array-Feld in den Abfragekriterien enthalten ist

  • kann nur verwendet werden, wenn ein einzelnes Array-Feld in den Abfragekriterien vorkommt

  • kann nur einmal in einer Projektion verwendet werden

Der $elemMatch Projektionsoperator

  • begrenzt den Inhalt eines Array-Felds, das in den Abfrageergebnissen enthalten ist, so dass es nur das erste Array-Element enthält, das mit der $elemMatch-Bedingung übereinstimmt .

  • erfordert nicht, dass das übereinstimmende Array in den Abfragekriterien enthalten ist

  • kann verwendet werden, um mehrere Bedingungen für Array-Elemente abzugleichen, die eingebettete Dokumente sind

Der $elemMatch Abfrageoperator

Beachten Sie, dass es auch ein $elemMatch gibt Abfrageoperator, der einen ähnlichen Abgleich durchführt, jedoch eher in der Abfrage als in der Ergebnisprojektion. Es ist nicht ungewöhnlich, dass dies in Kombination mit einem $ verwendet wird Projektion.

Ausleihen eines Beispiels aus der Dokumentation wo Sie beides verwenden könnten:

db.students.find(
    // use $elemMatch query operator to match multiple criteria in the grades array
    { grades: {
        $elemMatch: {
            mean:  { $gt: 70 },
            grade: { $gt: 90 }
        }
    }},

    // use $ projection to get the first matching item in the "grades" array
    { "grades.$": 1 }
)