2012-01-12 12 views
110

tengo un dato como este en mongodbconsulta de retorno basado en la fecha

{ "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 consultar db.gpsdatas.find({'createdAt': ??what here??}) por lo que me devuelve el resultado por encima de db?

Respuesta

237

Es posible que desee hacer una consulta intervalo, 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 o igual), porque esto es a menudo utilizado para la fecha -solo consultas, donde el componente de tiempo es 00:00:00.

Si realmente quiere encontrar una fecha que es igual a otra fecha, la sintaxis sería

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

obteniendo el error: ISODate no está definido. – coure2011

+0

¿qué versión estás usando? – mnemosyn

+0

node.js es v0.4.8 – coure2011

12

si desea obtener los elementos en cualquier lugar en esa fecha es necesario comparar dos fechas

Puede cree 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) 
8

Sólo venido implementando algo similar en Mongo V3.2.3 usando v0.12.7 de nodo y v4.4.4 y utilizado:

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

Estoy de paso en una 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!

3

También puede intentar "dateProp": {$gt: new Date('06/15/2016').getTime() }

5

Si desea obtener todas las cosas nuevas en los últimos 5 minutos que tendría que hacer algunos cálculos, pero no es difícil ...

En primer lugar crear un índice en la propiedad que desea hacer coincidir el (incluya el tipo de dirección descendente -1 y 1 para ascendente)

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

luego volver a consultar los documentos creados en los últimos 5 minutos (60 segundos * 5 minutos) .... porque javascript .getTime() devuelve milisegundos que necesita multiplicar por 1000 antes de usarlo como entrada al constructor new Date().

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

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

En primer lugar, calcular "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 por lo que es fácil de cambiar. Puedo simplemente cambiar 5 a 120 si quiero 2 horas (120 minutos).
  3. new Date().getTime()-60*5*1000 nos da (hace 5 minutos en ms) 1484383878676

Ahora tenemos que alimentar a un constructor que new Date() para obtener el formato de cadena ISO requerida por las marcas de tiempo MongoDB.

  1. { $gte: new Date(resultFromAbove).toISOString() } (mongodb .find() consulta)
  2. Puesto que no podemos tener variables lo hacemos todo de una sola 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 2017-01-14T08:53:17.586Z

por supuesto da esto es un poco más fácil con variables si está utilizando el controlador de nodo-mongodb-natal, pero esto funciona en el mon ir a la cáscara, que es lo que suelo usar para controlar las cosas.

+0

Creo que puedes usar 'Date.now()' en lugar de 'new Date(). getTime()' –

Cuestiones relacionadas