Разликата в използването на проекция е донякъде фина. Във вашето примерно използване това трябва да са еквивалентни заявки (по отношение на използването на индекса), но $elemMatch
примерът ненужно повтаря критериите на заявката. $
проекцията би била по-разумен избор за този пример.
Съществена разлика, отбелязана в документацията, е масив ограничение на полето
за $
прогнози:
Някои допълнителни бележки относно разликите в операторите за проекция по-долу ...
Позиционният ($
) оператор на проекция
:
-
ограничава съдържанието на поле от масив, което е включено в резултатите от заявката, за да съдържа първия елемент, който съответства на документа на заявката.
-
изисква полето за съответстващ масив да бъде включено в критериите на заявката
-
може да се използва само ако в критериите на заявката
се появи едно поле за масив -
може да се използва само веднъж в проекция
$elemMatchкод> оператор на проекция
-
ограничава съдържанието на поле от масив, което е включено в резултатите от заявката, за да съдържа само първия елемент от масива, който отговаря на условието $elemMatch .
-
не изисква съответстващият масив да бъде в критериите на заявката
-
може да се използва за съвпадение на множество условия за елементи от масив, които са вградени документи
$elemMatch
оператор на заявка
Имайте предвид, че има и $elemMatch
оператор на заявка, който извършва подобно съвпадение, но в заявката, а не в проекцията на резултатите. Не е необичайно това да се използва в комбинация с $
проекция.
Заемане на пример от документите където можете да използвате и двете:
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 }
)