Aby zrozumieć, co mówi dokumentacja, najpierw musisz zrozumieć, jak działa zapytanie zakresowe z tablicą.
Załóżmy, że w swojej kolekcji masz następujący dokument:
{ "finished" : [ 27, 3 ] },
{ "finished" : 17 }
Pierwsze zapytanie:
db.users.find( { "finished": { "$elemMatch": { "$gt": 15, "$lt": 20 } } } )
Zwróci tylko dokument, w którym „zakończono” jest tablicą. Dzieje się tak, ponieważ $elemMatch
operator dopasowuje tylko dokumenty, w których pole jest tablicą i gdzie pojedynczy element spełnia wszystkie kryteria zapytania.
Ale drugie pytanie:
db.users.find( { "finished": { "$gt": 15, "$lt": 20 } } )
zwróci oba dokumenty, co prawdopodobnie nie jest tym, czego chcesz jako 27
jest większe niż 20
i 3
jest mniejsza niż 15
. Dzieje się tak, ponieważ 27
spełnia pierwsze kryteria i 3
drugi. To zachowanie jest opisane w dokumentacji.
...jeden element może spełniać warunek większy niż 15, a inny element mniej niż 20, lub jeden element może spełniać oba:
Wniosek:
Zapytania zakresowe względem tablic będą pasować do jednego lub wielu elementów w tablicy, które spełniają wszystkie kryteria zapytania.
Lekcja:
Nie używaj zapytań o zakres z tablicami. Otrzymasz nieoczekiwany wynik.