consulta de devolución basada en la fecha

Tengo una información como esta en mongodb

{ "latitude" : "", "longitude" : "", "course" : "", "battery" : "0", "imei" : "0", "altitude" : "F:3.82V", "mcc" : "07", "mnc" : "007B", "lac" : "2A83", "_id" : ObjectId("4f0eb2c406ab6a9d4d000003"), "createdAt" : ISODate("2012-01-12T20:15:31Z") } 

¿Cómo db.gpsdatas.find({'createdAt': ??what here??}) , para que me devuelva el resultado de datos anterior del db?

Probablemente desee hacer una consulta de rango, por ejemplo, todos los elementos creados después de una fecha determinada:

 db.gpsdatas.find({"createdAt" : { $gte : new ISODate("2012-01-12T20:15:31Z") }}); 

Estoy usando $gte (mayor que o igual), porque esto se usa a menudo para consultas de solo fecha, donde el componente de tiempo es 00:00:00.

Si realmente desea encontrar una fecha que sea igual a otra fecha, la syntax sería

 db.gpsdatas.find({"createdAt" : new ISODate("2012-01-12T20:15:31Z") }); 

Si desea obtener artículos en cualquier lugar en esa fecha, necesita comparar dos fechas

Puede crear dos fechas de la primera como esta, para comenzar el día y al final del día.

 var startDate = new Date(); // this is the starting date that looks like ISODate("2014-10-03T04:00:00.188Z") startDate.setSeconds(0); startDate.setHours(0); startDate.setMinutes(0); var dateMidnight = new Date(startDate); dateMidnight.setHours(23); dateMidnight.setMinutes(59); dateMidnight.setSeconds(59); ### MONGO QUERY var query = { inserted_at: { $gt:morning, $lt:dateScrapedMidnight } }; //MORNING: Sun Oct 12 2014 00:00:00 GMT-0400 (EDT) //MIDNIGHT: Sun Oct 12 2014 23:59:59 GMT-0400 (EDT) 

Acabo de implementar algo similar en Mongo v3.2.3 usando el nodo v0.12.7 y v4.4.4 y lo utilicé:

 { $gte: new Date(dateVar).toISOString() } 

Estoy pasando un ISODate (por ejemplo, 2016-04-22T00: 00: 00Z) y esto funciona para una consulta .find () con o sin la función toISOString. Pero cuando se usa en una consulta .aggregate () $ match, ¡no le gusta la función toISOString!

Si quieres obtener todo lo nuevo en los últimos 5 minutos, deberías hacer algunos cálculos, pero no es difícil …

Primero crea un índice en la propiedad con la que quieres hacer coincidir (incluye la dirección de clasificación -1 para descender y 1 para ascender)

 db.things.createIndex({ createdAt: -1 }) // descending order on .createdAt 

A continuación, busque documentos creados en los últimos 5 minutos (60 segundos * 5 minutos) …. porque javascript’s .getTime() devuelve milisegundos que necesita multiplicar por 1000 antes de usarlo como entrada al new Date() constructor de new Date() .

 db.things.find({ createdAt: { $gte: new Date(new Date().getTime()-60*5*1000).toISOString() } }) .count() 

Explicación para new Date(new Date().getTime()-60*5*1000).toISOString() es la siguiente:

Primero calculamos “hace 5 minutos”:

  1. new Date().getTime() nos da la hora actual en milisegundos
  2. Queremos restar 5 minutos (en ms) de eso: 5*60*1000 – Simplemente multiplico por 60 segundos, así que es fácil de cambiar. Puedo cambiar de 5 a 120 si quiero 2 horas (120 minutos).
  3. new Date().getTime()-60*5*1000 nos da 1484383878676 (hace 5 minutos en ms)

Ahora necesitamos alimentarlo con un new Date() constructor de new Date() para obtener el formato de cadena ISO requerido por las marcas de tiempo de MongoDB.

  1. { $gte: new Date(resultFromAbove).toISOString() } (consulta mongodb .find ())
  2. Como no podemos tener variables, lo hacemos todo de una vez: new Date(new Date().getTime()-60*5*1000)
  3. … luego convertir a cadena ISO: .toISOString()
  4. new Date(new Date().getTime()-60*5*1000).toISOString() nos da 2017-01-14T08:53:17.586Z

Por supuesto, esto es un poco más fácil con las variables si está utilizando el controlador node-mongodb-native, pero esto funciona en el shell de mongo, que es lo que suelo usar para verificar cosas.

También puedes probar:

 { "dateProp": { $gt: new Date('06/15/2016').getTime() } }