Това поведение се очаква и е обяснено в документацията на mongo тук .
Mongo изглежда желае да играе "самодоволно", като връща резултати, когато комбинация от елементи на масив отговаря на всички условия независимо.
В нашия пример 5 съответства на условието $lt:20, а 25 съответства на условието $gt:10. Значи съвпадение е.
И двете от следните ще върнат резултата [5,25]:
db.collection.find({ x: {$gt: 10, $lt: 20} })
db.collection.find({ $and : [{x: {$gt: 10}},{x:{ $lt: 20}} ] })
Ако това е очакваното от потребителя поведение, мненията могат да се различават. Но със сигурност е документиран и трябва да се очаква.
Редактиране , за садистичната, но изключително образователна редакция на Нийл на оригиналния отговор, с искане за решение:
Използване на $elemMatch може да прави "по-строги" сравнения на елементи само за масиви .
db.collection.find({ x: { $elemMatch:{ $gt:10, $lt:20 } } })
Забележка :това ще съответства както на x:[11,12] и x:[11,25]
Вярвам, че когато е необходима заявка като тази, комбинация от две се изискват заявки и резултатите се комбинират. По-долу е дадена заявка, която връща правилни резултати за документи, като x не е масив :
db.collection.find( { $where : "!Array.isArray(this.x)", x: {$gt: 10, $lt: 20} } )
Но най-добрият подход в този случай е да промените типа x на винаги да бъде масив, дори когато съдържа само един елемент. След това се изисква само заявката $elemMatch, за да получите правилни резултати с очаквано поведение.