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) })
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)}})
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
.
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.
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.
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'
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
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