To zachowanie jest oczekiwane i wyjaśnione w dokumentacji mongo tutaj .
Mongo wydaje się być chętny do zabawy w „smug”, dając wyniki, gdy kombinacja elementów tablicy spełnia wszystkie warunki niezależnie.
W naszym przykładzie 5 odpowiada warunku $lt:20, a 25 odpowiada warunku $gt:10. Więc to pasuje.
Oba poniższe zwrócą wynik [5,25]:
db.collection.find({ x: {$gt: 10, $lt: 20} })
db.collection.find({ $and : [{x: {$gt: 10}},{x:{ $lt: 20}} ] })
Jeśli jest to zachowanie oczekiwane przez użytkownika, opinie mogą się różnić. Ale z pewnością jest to udokumentowane i należy się tego spodziewać.
Edytuj , za sadystyczną, ale bardzo edukacyjną edycję Neila do oryginalnej odpowiedzi, prosząc o rozwiązanie:
Korzystanie z $elemMatch może dokonywać „bardziej rygorystycznych” porównań elementów dla tablic .
db.collection.find({ x: { $elemMatch:{ $gt:10, $lt:20 } } })
Uwaga :pasuje zarówno do x:[11,12] i x:[11,25]
Wierzę, że gdy potrzebne jest takie zapytanie, kombinacja dwóch zapytania są wymagane, a wyniki połączone. Poniżej znajduje się zapytanie, które zwraca poprawne wyniki dla dokumentów, w których x nie jest tablicą :
db.collection.find( { $where : "!Array.isArray(this.x)", x: {$gt: 10, $lt: 20} } )
Ale najlepsze podejście w tym przypadku należy zmienić typ x na zawsze być tablicą, nawet jeśli zawiera tylko jeden element. Wtedy do uzyskania poprawnych wyników z oczekiwanym zachowaniem wymagane jest tylko zapytanie $elemMatch.