consulta de devolución basada en la fecha

210

Tengo datos como este 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 hago una consulta db.gpsdatas.find({'createdAt': ??what here??})para que me devuelva el resultado de datos anterior de la base de datos?

coure2011
fuente
hubiera sido eficaz haber mencionado qué biblioteca de nodejs estaba usando, pero según el ejemplo parece que son sus mongoosejs
Grimnoff

Respuestas:

422

Probablemente desee realizar 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 a menudo se usa para consultas solo de fecha, donde el componente de tiempo es 00:00:00.

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

db.gpsdatas.find({"createdAt" : new ISODate("2012-01-12T20:15:31Z") });
mnemosyn
fuente
14
Ahh :) Pensé que estabas usando la consola Mongo. Hay ISODateun contenedor para el objeto js Date. Intenta algo como "createdAt" : new Date("2010-01-01"). Sin embargo, por alguna razón, ese código no funciona (para la versión 2.0.2) en la consola Mongo.
mnemosyn
¿La inicialización de la fecha usaría barras en lugar de guiones? así:new Date("2010/01/01");
Victor S
16

si desea obtener artículos en cualquier lugar en esa fecha, debe comparar dos fechas

Puede crear dos fechas a partir de la primera como esta, para obtener el comienzo del día y el 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)
med116
fuente
16

Acabo de implementar algo similar en Mongo v3.2.3 usando Node v0.12.7 y v4.4.4 y 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 de coincidencia $ .gregregate () no le gusta la función toISOString!

Pablo
fuente
12

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

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

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

Luego, consulte 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 para el new Date()constructor.

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 60segundos para que sea fácil de cambiar. Solo puedo cambiar 5a120 si quiero 2 horas (120 minutos).
  3. new Date().getTime()-60*5*1000nos da 1484383878676(hace 5 minutos en ms)

Ahora necesitamos alimentar eso en un new Date()constructor para obtener el formato de cadena ISO requerido por las marcas de tiempo 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 mongo, que es lo que generalmente uso para verificar las cosas.

chovy
fuente
1
Creo que puedes usar Date.now() lugar denew Date().getTime()
Béranger
4

También puedes probar:

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

Si estás usando Mangosta,

try {
  const data = await GPSDatas.aggregate([
    {
      $match: { createdAt : { $gt: new Date() }
    },
    {
      $sort: { createdAt: 1 }
    }
  ])
  console.log(data)

} catch(error) {
    console.log(error)
}
Atul Yadav
fuente
1

Encuentra con una fecha específica:

db.getCollection('CollectionName').find({"DepartureDate" : new ISODate("2019-06-21T00:00:00.000Z")})

Encuentra con mayor gteo menor lt:

db.getCollection('CollectionName').find({"DepartureDate" : { $gte : new ISODate("2019-06-11T00:00:00.000Z") }})

Buscar por rango:

db.getCollection('CollectionName').find({ 
    "DepartureDate": { 
        $lt: new Date(), 
        $gte: new Date(new Date().setDate(new Date().getDate()-15))
      } 
    })
Hamit YILDIRIM
fuente