MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

A consulta retorna mais resultados do que o esperado


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.