Este comportamiento se espera y se explica en la documentación de mongo aquí .
Mongo parece estar dispuesto a jugar "engreído", devolviendo resultados cuando una combinación de elementos de matriz coincide con todas las condiciones de forma independiente.
En nuestro ejemplo, 5 coincide con la condición $lt:20 y 25 coincide con la condición $gt:10. Entonces, es una coincidencia.
Ambos de los siguientes devolverán el resultado [5,25]:
db.collection.find({ x: {$gt: 10, $lt: 20} })
db.collection.find({ $and : [{x: {$gt: 10}},{x:{ $lt: 20}} ] })
Si este es el comportamiento esperado del usuario, las opiniones pueden variar. Pero ciertamente está documentado y debe esperarse.
Editar , para la edición sádica pero altamente educativa de Neil a la respuesta original, pidiendo una solución:
Uso de $elemMatch puede hacer comparaciones de elementos "más estrictas" para matrices solamente .
db.collection.find({ x: { $elemMatch:{ $gt:10, $lt:20 } } })
Nota :esto coincidirá con x:[11,12] y x:[11,25]
Creo que cuando se necesita una consulta como esta, una combinación de dos se requieren consultas, y los resultados combinados. A continuación se muestra una consulta que devuelve resultados correctos para documentos en los que x no es una matriz :
db.collection.find( { $where : "!Array.isArray(this.x)", x: {$gt: 10, $lt: 20} } )
Pero el mejor enfoque en este caso es cambiar el tipo de x a siempre ser una matriz, incluso cuando solo contiene un elemento. Entonces, solo se requiere la consulta $elemMatch para obtener resultados correctos, con el comportamiento esperado.