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 }
)