Rozdíl v použití projekce je poněkud jemný. Ve vašem příkladu použití by to měly být ekvivalentní dotazy (z hlediska použití indexu), ale $elemMatch
příklad zbytečně opakuje kritéria dotazu. $
projekce by byla pro tento příklad rozumnější volbou.
Zásadním rozdílem uvedeným v dokumentaci je pole omezení pole
pro $
projekce:
Některé další poznámky k rozdílům v operátorech projekce níže ...
Polohový poziční ($
) operátor projekce
:
-
omezuje obsah pole pole, které je zahrnuto ve výsledcích dotazu, tak, aby obsahovalo první prvek, který odpovídá dokumentu dotazu.
-
vyžaduje, aby bylo odpovídající pole pole zahrnuto v kritériích dotazu
-
lze použít pouze v případě, že se v kritériích dotazu objeví jedno pole pole
-
lze v projekci použít pouze jednou
The $elemMatch
operátor projekce
-
omezuje obsah pole pole, které je zahrnuto ve výsledcích dotazu, tak, aby obsahoval pouze první prvek pole, který odpovídá podmínce $elemMatch .
-
nevyžaduje, aby bylo odpovídající pole v kritériích dotazu
-
lze použít ke shodě více podmínek pro prvky pole, které jsou vloženými dokumenty
The $elemMatch
operátor dotazu
Všimněte si, že existuje také $elemMatch
dotazovací operátor, který provádí podobnou shodu, ale v dotazu spíše než v projekci výsledků. Není neobvyklé, že se toto používá v kombinaci s $
projekce.
Půjčení příkladu z dokumentů kde můžete použít obojí:
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 }
)