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

Pregunta de consulta Mongo $gt,$lt

Este es un tema realmente confuso. Trabajo en 10gen y tuve que pasar un rato dándole vueltas a la cabeza;)

Veamos cómo el motor de consultas procesa esta consulta.

Aquí está la consulta de nuevo:

> db.test.find({ b : { $gt :  4, $lt : 6}});

Cuando llega al registro que parece que no debería coincidir...

{ "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 4, 6, 8 ] }

La coincidencia no se realiza contra cada elemento de la matriz, sino contra la matriz como un todo.

La comparación se realiza en tres pasos:

Paso 1 :Encuentra todos los documentos donde b tiene un valor mayor que 4

b:[2,4,6,8] coincide porque 6 y 8 son mayores que 4

Paso 2 :Buscar todos los documentos donde b tiene un valor inferior a 6

b:[2,4,6,8] coincide porque 2 y 4 son menores que 6

Paso 3 :busque el conjunto de documentos que coincidieron en los pasos 1 y 2.

El documento con b:[2,4,6,8] coincidió con los pasos 1 y 2, por lo que se devuelve como una coincidencia. Tenga en cuenta que los resultados también se desduplican en este paso, por lo que el mismo documento no se devolverá dos veces.

Si desea que su consulta se aplique a los elementos individuales de la matriz, en lugar de a la matriz como un todo, puede usar el operador $elemMatch. Por ejemplo

> db.temp.find({b: {$elemMatch: {$gt: 4, $lt: 5}}})
> db.temp.find({b: {$elemMatch: {$gte: 4, $lt: 5}}})
  { "_id" : ObjectId("4d558b6f4f0b1e2141b66660"), "b" : [ 2, 3, 4, 5, 6 ] }