La consulta de fecha con ISODate en mongodb no parece funcionar

No parece ser capaz de obtener incluso la consulta de fecha más básica para trabajar en MongoDB. Con un documento que se ve así:

{ "_id" : "foobar/201310", "ap" : "foobar", "dt" : ISODate("2013-10-01T00:00:00.000Z"), "tl" : 375439 } 

Y una consulta que se ve así:

 { "dt" : { "$gte" : { "$date" : "2013-10-01T00:00:00.000Z" } } } 

Obtengo 0 resultados de la ejecución:

 db.mycollection.find({ "dt" : { "$gte" : { "$date" : "2013-10-01T00:00:00.000Z"}} }) 

¿Alguna idea de por qué esto no funciona?

Como referencia, Spring’s MongoTemplate está produciendo esta consulta, por lo que no tengo control directo sobre la consulta que finalmente se envía a MongoDB.

(PD)

 > db.version() 2.4.7 

¡Gracias!

Aunque $date forma parte de MongoDB Extended JSON y eso es lo que obtienes por defecto con mongoexport , no creo que puedas usarlo realmente como parte de la consulta.

Si intenta la búsqueda exacta con $date como a continuación:

 db.foo.find({dt: {"$date": "2012-01-01T15:00:00.000Z"}}) 

obtendrás un error:

 error: { "$err" : "invalid operator: $date", "code" : 10068 } 

Prueba esto:

 db.mycollection.find({ "dt" : {"$gte": new Date("2013-10-01T00:00:00.000Z")} }) 

o (siguiendo los comentarios de @ user3805045 ):

 db.mycollection.find({ "dt" : {"$gte": ISODate("2013-10-01T00:00:00.000Z")} }) 

ISODate puede ser requerido para comparar fechas sin tiempo (notado por @MattMolnar ).

Según los tipos de datos en el mongo Shell, ambos deberían ser equivalentes:

El shell mongo proporciona varios métodos para devolver la fecha, ya sea como una cadena o como un objeto Date:

  • Método de fecha () que devuelve la fecha actual como una cadena.
  • nuevo constructor Date () que devuelve un objeto Date usando el contenedor ISODate ().
  • Constructor ISODate () que devuelve un objeto Date usando el contenedor ISODate ().

y el uso de ISODate aún debe devolver un objeto Date .

{"$date": "ISO-8601 string"} se puede usar cuando se requiere una representación JSON estricta. Un posible ejemplo es el conector Hadoop.

De los comentarios de la página del libro de cocina MongoDB :

 "dt" : { "$gte" : ISODate("2014-07-02T00:00:00Z"), "$lt" : ISODate("2014-07-03T00:00:00Z") } 

Esto funcionó para mí. En contexto completo, el siguiente comando obtiene cada registro donde el campo de fecha de dt tiene una fecha en 2013-10-01 (AAAA-MM-DD) Zulu:

 db.mycollection.find({ "dt" : { "$gte" : ISODate("2013-10-01T00:00:00Z"), "$lt" : ISODate("2013-10-02T00:00:00Z") }}) 

Prueba esto:

 { "dt" : { "$gte" : ISODate("2013-10-01") } } 

En el modo estricto json, deberás mantener el orden:

 { "dt": { "$gte": { "$date": "2013-10-01T00:00:00.000Z" } } } 

Lo único que funcionó para definir mis consultas de búsqueda en mlab.com.

Estoy usando robomongo como gui del cliente mongodb y el siguiente funcionó para mí

 db.collectionName.find({"columnWithDateTime" : { $lt:new ISODate("2016-02-28T00:00:00.000Z")}}) 

En el lado de la aplicación estoy usando el controlador mongodb basado en nodejs (v1.4.3), la aplicación usa datepicker en el ui que da la fecha como YYYY-mm-dd, esto se agrega con el tiempo predeterminado como 00:00:00 y luego se da al new Date() constructor new Date() y luego suministrado al objeto de criterios mongodb, creo que el controlador convierte la fecha en ISO y la consulta funciona y da el resultado deseado; sin embargo, el mismo new Date() constructor new Date() no funciona o muestra el mismo salida en robo mongo, por los mismos criterios, lo cual es extraño, ya que utilicé robomongo para verificar mis objetos de criterio.

Mientras que la cli mongoshell por defecto funciona bien con ISODate y con la new Date()

En el shell MongoDB:

 db.getCollection('sensorevents').find({from:{$gt: new ISODate('2015-08-30 16:50:24.481Z')}}) 

En mi código nodeJS (usando Mongoose)

  SensorEvent.Model.find( { from: { $gt: new Date( SensorEventListener.lastSeenSensorFrom ) } } ) 

Estoy consultando mi colección de eventos del sensor para devolver valores donde el campo ‘de’ es mayor que la fecha dada

este es mi documento

 "_id" : ObjectId("590173023c488e9a48e903d6"), "updatedAt" : ISODate("2017-04-27T04:26:42.709Z"), "createdAt" : ISODate("2017-04-27T04:26:42.709Z"), "flightId" : "590170f97cb84116075e2680", "_id" : ObjectId("590173023c488e9a48e903d6"), "updatedAt" : ISODate("2017-04-28T03:26:42.609Z"), "createdAt" : ISODate("2017-04-28T03:26:42.609Z"), "flightId" : "590170f97cb84116075e2680", 

ahora quiero encontrar cada 27to documento de fecha. Así que utilicé esto …

  > db.users.find({createdAt:{"$gte":ISODate("2017-04-27T00:00:00Z"),"$lt":ISODate("2017-04-28T00:00:00Z") }}).count() result:1 

esto funcionó para mí.