Różnica w korzystaniu z projekcji jest nieco subtelna. W przykładowym użyciu powinny to być równoważne zapytania (pod względem użycia indeksu), ale $elemMatch
przykład niepotrzebnie powtarza kryteria zapytania. $
projekcja byłaby bardziej rozsądnym wyborem dla tego przykładu.
Istotną różnicą odnotowaną w dokumentacji jest tablica ograniczenie pola
dla $
projekcje:
Kilka dalszych uwag na temat różnic w operatorach projekcji poniżej ...
pozycyjny ($
) operator projekcji
:
-
ogranicza zawartość pola tablicy, która jest zawarta w wynikach zapytania, tak aby zawierała pierwszy element pasujący do dokumentu zapytania.
-
wymaga, aby pasujące pole tablicy było uwzględnione w kryteriach zapytania
-
można użyć tylko wtedy, gdy w kryteriach zapytania pojawia się jedno pole tablicy
-
można użyć tylko raz w projekcji
$elemMatch operator projekcji
-
ogranicza zawartość pola tablicy, która jest zawarta w wynikach zapytania, aby zawierała tylko pierwszy element tablicy spełniający warunek $elemMatch .
-
nie wymaga, aby pasująca tablica znajdowała się w kryteriach zapytania
-
może być użyty do dopasowania wielu warunków dla elementów tablicy, które są dokumentami osadzonymi
$elemMatch
operator zapytania
Zauważ, że istnieje również $elemMatch
operator zapytania, który wykonuje podobne dopasowanie, ale w zapytaniu, a nie w projekcji wyników. Często zdarza się, że jest to używane w połączeniu z $
projekcja.
Pożyczanie przykładu z dokumentów gdzie możesz użyć obu:
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 }
)