Skillnaden i projektionsanvändning är något subtil. I din exempelanvändning bör dessa vara likvärdiga frågor (när det gäller indexanvändning) men $elemMatch
exemplet upprepar frågekriterierna i onödan. $
projektion skulle vara ett mer förnuftigt val för detta exempel.
En väsentlig skillnad som noteras i dokumentationen är arrayen fältbegränsning
för $
projektioner:
Några ytterligare anteckningar om skillnaderna i projektionsoperatorerna nedan ...
Den positionella ($
) projektionsoperatör
:
-
begränsar innehållet i ett matrisfält som ingår i frågeresultaten till att innehålla det första elementet som matchar frågedokumentet.
-
kräver att det matchande matrisfältet ingår i frågekriterierna
-
kan endast användas om ett enstaka matrisfält visas i frågekriterierna
-
kan bara användas en gång i en projektion
$elemMatch projektionsoperatör
-
begränsar innehållet i ett matrisfält som ingår i frågeresultaten till att endast innehålla det första matriselementet som matchar $elemMatch-villkoret .
-
kräver inte att den matchande matrisen finns i frågekriterierna
-
kan användas för att matcha flera villkor för arrayelement som är inbäddade dokument
$elemMatch
frågeoperator
Observera att det också finns en $elemMatch
frågeoperator som utför liknande matchning, men i frågan snarare än resultatprojektionen. Det är inte ovanligt att detta används i kombination med en $
projektion.
Lånar ett exempel från dokumenten där du kan använda båda:
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 }
)