MongoDB / Mongoose consulta en una fecha específica?


¿Es posible consultar una fecha específica ?

Encontré en el libro de cocina de mongo que podemos hacerlo para un rango Consultando un rango de fechas Así:

db.posts.find({"created_on": {"$gte": start, "$lt": end}})

Pero, ¿es posible para una fecha específica ? Esto no funciona :

db.posts.find({"created_on": new Date(2012, 7, 14) })
Author: Unitech, 2012-08-15

6 answers

Eso debería funcionar si las fechas guardadas en la base de datos no tienen tiempo (solo año, mes, día).

Lo más probable es que las fechas guardadas fueran new Date(), que incluye los componentes de tiempo. Para consultar esas horas, debe crear un rango de fechas que incluya todos los momentos de un día.

db.posts.find( //query today up to tonight
  {"created_on": {"$gte": new Date(2012, 7, 14), "$lt": new Date(2012, 7, 15)}})
 148
Author: rdrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-28 15:21:01

Para aquellos de nosotros usando Momento.js

var moment = require('moment')

var today = moment().startOf('day')
var tomorrow = moment(today).endOf('day')

MyModel.find({
  createdAt: {
    $gte: today.toDate(),
    $lt: tomorrow.toDate()
  }
})

Importante: todos los momentos son mutables!

tomorrow = today.add(1, 'days') no funciona ya que también muta today. Llamar a moment(today) resuelve ese problema al clonar implícitamente today.

 85
Author: Pier-Luc Gendreau,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-06-11 17:54:32

Sí, el objeto Date completa la fecha y la hora, por lo que compararlo con solo el valor date no funciona.

Simplemente puede utilizar el $donde operador para expresar una condición más compleja con la expresión booleana de Javascript:)

db.posts.find({ '$where': 'this.created_on.toJSON().slice(0, 10) == "2012-07-14"' })

created_on es el campo datetime y 2012-07-14 es la fecha especificada.

La fecha debe estar exactamente en formato AAAA-MM-DD.

Nota: Use $where con moderación, tiene implicaciones de rendimiento.

 5
Author: Faisal Hasnain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-06 16:12:43

¿has probado:

db.posts.find({"created_on": {"$gte": new Date(2012, 7, 14), "$lt": new Date(2012, 7, 15)}})

El problema que vas a encontrar es que las fechas se almacenan como marcas de tiempo en Mongo. Por lo tanto, para que coincida con una fecha que está pidiendo que coincida con una marca de tiempo. En tu caso creo que estás tratando de igualar un día (es decir. de 00:00 a 23:59 en una fecha específica). Si sus fechas se almacenan sin horas, entonces debería estar bien. De lo contrario, intente especificar su fecha como un intervalo de tiempo en el mismo día (es decir. start = 00:00, end=23: 59) si gte no funciona.

Similar pregunta

 5
Author: Michael D Johnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:45

Puede usar el siguiente enfoque para el método API para obtener resultados de un día específico:

# [HTTP GET]
getMeals: (req, res) ->
  options = {}
  # eg. api/v1/meals?date=Tue+Jan+13+2015+00%3A00%3A00+GMT%2B0100+(CET)
  if req.query.date?
    date = new Date req.query.date
    date.setHours 0, 0, 0, 0
    endDate = new Date date
    endDate.setHours 23, 59, 59, 59
    options.date =
      $lt: endDate
      $gte: date

  Meal.find options, (err, meals) ->
      if err or not meals
        handleError err, meals, res
      else
        res.json createJSON meals, null, 'meals'
 4
Author: Daniel Kmak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-14 21:57:00

Tuvimos un problema relacionado con los datos duplicados en nuestra base de datos, con un campo de fecha que tenía múltiples valores donde se suponía que teníamos 1. Pensé en agregar la forma en que resolvimos el problema como referencia.

Tenemos una colección llamada "data" con un campo numérico "value" y un campo date "date". Tuvimos un proceso que pensamos que era idempotente, pero terminamos agregando 2 x valores por día en la segunda ejecución:

{ "_id" : "1", "type":"x", "value":1.23, date : ISODate("2013-05-21T08:00:00Z")}
{ "_id" : "2", "type":"x", "value":1.23, date : ISODate("2013-05-21T17:00:00Z")}

Solo necesitamos 1 de los 2 registros, por lo que tuvimos que recurrir al javascript para limpiar sube el db. Nuestro enfoque inicial iba a ser iterar a través de los resultados y eliminar cualquier campo con un tiempo de entre 6 a.m. y 11 a. m. (todos los duplicados fueron por la mañana), pero durante la implementación, hicimos un cambio. Aquí está el script usado para arreglarlo:

var data = db.data.find({"type" : "x"})
var found = [];
while (data.hasNext()){
    var datum = data.next();
    var rdate = datum.date;
    // instead of the next set of conditions, we could have just used rdate.getHour() and checked if it was in the morning, but this approach was slightly better...
    if (typeof found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()] !== "undefined") {
       if (datum.value != found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()]) {
           print("DISCREPENCY!!!: " + datum._id + " for date " + datum.date);
       }
       else {
           print("Removing " + datum._id);
           db.data.remove({ "_id": datum._id});
       }
    }
    else {
       found[rdate.getDate()+"-"+rdate.getMonth() + "-" + rdate.getFullYear()] = datum.value;
    }
}

Y luego lo ejecutó con mongo thedatabase fixer_script.js

 0
Author: Brett,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-23 08:50:21