To naprawdę zagmatwany temat. Pracuję na 10gen i musiałem spędzić trochę czasu owijając się wokół niego;)
Przyjrzyjmy się, jak aparat zapytań przetwarza to zapytanie.
Oto zapytanie ponownie:
> db.test.find({ b : { $gt : 4, $lt : 6}});
Kiedy dociera do rekordu, wydaje się, że nie powinien pasować...
{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 4, 6, 8 ] }
Dopasowanie nie jest wykonywane na każdym elemencie tablicy, ale na tablicy jako całości.
Porównanie odbywa się w trzech krokach:
Krok 1 :Znajdź wszystkie dokumenty, w których b ma wartość większą niż 4
b:[2,4,6,8] pasuje, ponieważ 6 i 8 są większe niż 4
Krok 2 :Znajdź wszystkie dokumenty, w których b ma wartość mniejszą niż 6
b:[2,4,6,8] pasuje, ponieważ 2 i 4 są mniejsze niż 6
Krok 3 :Znajdź zestaw dokumentów pasujących zarówno w kroku 1, jak i 2.
Dokument z b:[2,4,6,8] pasuje do obu kroków 1 i 2, więc jest zwracany jako dopasowanie. Pamiętaj, że w tym kroku wyniki są również usuwane z duplikatów, więc ten sam dokument nie zostanie zwrócony dwa razy.
Jeśli chcesz, aby zapytanie dotyczyło poszczególnych elementów tablicy, a nie całej tablicy, możesz użyć operatora $elemMatch. Na przykład
> db.temp.find({b: {$elemMatch: {$gt: 4, $lt: 5}}})
> db.temp.find({b: {$elemMatch: {$gte: 4, $lt: 5}}})
{ "_id" : ObjectId("4d558b6f4f0b1e2141b66660"), "b" : [ 2, 3, 4, 5, 6 ] }