gte fechas comparar mongodb

mongodb - fechas - Pregunta de Mongo $ gt, $ lt



mongodb gte date (4)

Tengo una consulta a continuación. Quiero obtener elementos entre 4 y 6, por lo que solo un: 1 debe coincidir porque tiene el valor 5 en b.

> db.test.find({ b : { $gt : 4 }, b: {$lt : 6}}); { "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 3, 4, 5 ] } { "_id" : ObjectId("4d54d0074364000000004332"), "a" : 2, "b" : [ 2, 4, 6, 8 ] } >

¿Alguien puede decir por qué un: 2 coincide con esta consulta? Realmente no puedo ver por qué se está devolviendo.

También probé lo que estaba especificado en el tutorial pero la identificación no parece funcionar:

> db.test.find({ b : { $gt : 4, $lt : 6}}); { "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 3, 4, 5 ] } { "_id" : ObjectId("4d54d0074364000000004332"), "a" : 2, "b" : [ 2, 4, 6, 8 ] } >

Y esta para evitar cualquier confusión con respecto a GT / GTE.

> db.test.find({b: {$gt: 4.5, $lt: 5.5}}); { "_id" : ObjectId("4d54cff54364000000004331"), "a" : 1, "b" : [ 2, 3, 4, 5 ] } { "_id" : ObjectId("4d54d0074364000000004332"), "a" : 2, "b" : [ 2, 4, 6, 8 ] } >

solo un: 1 debe ser devuelto.

Como se sugirió, probé con $ elemMatch pero tampoco pareció funcionar (los ObjectIds son diferentes porque estoy en una máquina diferente)

> db.test.find(); { "_id" : ObjectId("4d5a24a5e82e00000000433f"), "a" : 1, "b" : [ 2, 3, 4, 5 ] } { "_id" : ObjectId("4d5a24bbe82e000000004340"), "a" : 2, "b" : [ 2, 4, 6, 8 ] } > db.test.find({b: {$elemMatch: {$gt : 4, $lt: 6 }}}); >

No se devolvieron documentos.


$ gt

Syntax: {field: {$gt: value} }

p.ej:

db.inventory.find( { qty: { $gt: 20 } } )

$ lt

Syntax: {field: {$lt: value} }

p.ej:

db.inventory.find( { qty: { $lt: 20 } } )

eg2:

db.inventory.find({ qty : { $gt : 20, $lt : 60}});


Este es un tema realmente confuso. Trabajo en 10gen y tuve que pasar un rato envolviéndome 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 : Encuentre 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 : Encuentre todos los documentos donde b tiene un valor menor que 6

b: [2,4,6,8] coincide porque 2 y 4 son menos de 6

Paso 3 : Encuentre 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 coincidencia. Tenga en cuenta que los resultados también se deduplican 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 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 ] }


Porque no has comprobado la documentación.

Ver

http://www.mongodb.org/display/DOCS/Advanced+Queries

y compruebe los "rangos" en la página.

Tampoco es correcta la sintaxis de su consulta (compare con el ejemplo)

ni su parte de "por qué un: 2" de la pregunta tiene sentido ya que "a" no está involucrada en su consulta. Si desea buscar un: 1, debe incluirlo en su consulta.

Tenga en cuenta que todas las cláusulas de consulta Y se combinan de forma predeterminada a menos que use $ o el operador.


.find( {$and:[ {b:{$gt:4}}, {b:{$lt:6}} ]} )