Forskellen i projektionsbrug er noget subtil. I dit eksempelbrug skal disse være tilsvarende forespørgsler (med hensyn til indeksbrug), men $elemMatch
eksempel gentager forespørgselskriterierne unødigt. $
projektion ville være et mere fornuftigt valg for dette eksempel.
En væsentlig forskel bemærket i dokumentationen er arrayet feltbegrænsning
for $
projektioner:
Nogle yderligere bemærkninger om forskellene i projektionsoperatorerne nedenfor ...
Den positionelle ($
) projektionsoperatør
:
-
begrænser indholdet af et matrixfelt, der er inkluderet i forespørgselsresultaterne, til at indeholde det første element, der matcher forespørgselsdokumentet.
-
kræver, at det matchende matrixfelt er inkluderet i forespørgselskriterierne
-
kan kun bruges, hvis et enkelt matrixfelt vises i forespørgselskriterierne
-
kan kun bruges én gang i en projektion
$elemMatch projektionsoperatør
-
begrænser indholdet af et matrixfelt, der er inkluderet i forespørgselsresultaterne til kun at indeholde det første matrixelement der matcher $elemMatch-betingelsen .
-
kræver ikke, at det matchende array er i forespørgselskriterierne
-
kan bruges til at matche flere betingelser for array-elementer, der er indlejrede dokumenter
$elemMatch
forespørgselsoperatør
Bemærk, at der også er en $elemMatch
forespørgselsoperator, som udfører lignende matchning, men i forespørgslen i stedet for resultatprojektionen. Det er ikke ualmindeligt at se dette brugt i kombination med en $
projektion.
Lån af et eksempel fra dokumenterne hvor du kan bruge begge dele:
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 }
)