sql >> Base de Datos >  >> NoSQL >> MongoDB

La consulta devuelve más resultados de los esperados

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.