Esse comportamento é esperado e explicado na documentação do mongo aqui .
Mongo parece estar disposto a jogar "presunçoso", devolvendo resultados quando uma combinação de elementos de matriz corresponde a todas as condições de forma independente.
Em nosso exemplo, 5 corresponde à condição $lt:20 e 25 corresponde à condição $gt:10. Então, é uma partida.
Ambos os itens a seguir retornarão o resultado [5,25]:
db.collection.find({ x: {$gt: 10, $lt: 20} })
db.collection.find({ $and : [{x: {$gt: 10}},{x:{ $lt: 20}} ] })
Se este for o comportamento esperado do usuário, as opiniões podem variar. Mas certamente está documentado e deve ser esperado.
Editar , para a edição sádica e altamente educacional de Neil para a resposta original, pedindo uma solução:
Uso do $elemMatch pode fazer comparações de elementos "mais rigorosas" para arrays apenas .
db.collection.find({ x: { $elemMatch:{ $gt:10, $lt:20 } } })
Observação :isso corresponderá a x:[11,12] e x:[11,25]
Acredito que quando uma consulta como essa é necessária, uma combinação de dois consultas são necessárias e os resultados combinados. Abaixo está uma consulta que retorna resultados corretos para documentos com x sendo não uma matriz :
db.collection.find( { $where : "!Array.isArray(this.x)", x: {$gt: 10, $lt: 20} } )
Mas a melhor abordagem neste caso é mudar o tipo de x para sempre ser uma matriz, mesmo quando contém apenas um elemento. Então, apenas a consulta $elemMatch é necessária para obter resultados corretos, com o comportamento esperado.