Можно ли запросить конкретную дату?
Я нашел в кулинарной книге mongo, что мы можем сделать это для диапазона, запрашивая диапазон дат , например:
db.posts.find({"created_on": {"$gte": start, "$lt": end}})
Но возможно ли это на конкретную дату? Это не работает:
db.posts.find({"created_on": new Date(2012, 7, 14) })
... 5+ лет спустя я настоятельно рекомендую вместо этого использовать date-fns
import endOfDayfrom 'date-fns/endOfDay' import startOfDay from 'date-fns/startOfDay' MyModel.find({ createdAt: { $gte: startOfDay(new Date()), $lte: endOfDay(new Date()) } })
Для тех из нас, кто использует Moment.js
const moment = require('moment') const today = moment().startOf('day') MyModel.find({ createdAt: { $gte: today.toDate(), $lte: moment(today).endOf('day').toDate() } })
Важно: все моменты изменчивы !
tomorrow = today.add(1, 'days')
не работает, так как также мутируетtoday
. Вызовmoment(today)
решает эту проблему путем неявного клонированияtoday
.источник
.startOf('day')
вместо .hours (0) .minutes (0) .seconds (0). Итак, первая строка будет такой:var today = moment().startOf('day')
moment(today)
для клонирования объекта, другое решение:var tomorrow = today.clone().add(1, 'days')
$lt
:moment(today).endOf('day')
. Чтобы предотвратить включение фактических результатов на следующий день.moment(today).endOf('day')
дает один и тот же день с момента:23:59:59.999
. Так что на самом деле выглядит более правильным в использовании$lte
, иначе объекты в этот конкретный момент будут проигнорированы.Да, объект Date дополняет дату и время, поэтому сравнение его только со значением даты не работает.
Вы можете просто использовать оператор $ where, чтобы выразить более сложное условие с помощью логического выражения Javascript :)
db.posts.find({ '$where': 'this.created_on.toJSON().slice(0, 10) == "2012-07-14"' })
created_on
- это поле даты и времени, и2012-07-14
это указанная дата.Дата должна быть точно в формате ГГГГ-ММ-ДД .
Примечание: используйте
$where
экономно, это сказывается на производительности.источник
Попытался ли ты:
db.posts.find({"created_on": {"$gte": new Date(2012, 7, 14), "$lt": new Date(2012, 7, 15)}})
Проблема, с которой вы столкнетесь, заключается в том, что даты хранятся в Mongo как метки времени. Итак, чтобы сопоставить дату, вы просите ее сопоставить метку времени. В вашем случае я думаю, что вы пытаетесь сопоставить день (например, с 00:00 до 23:59 в определенную дату). Если ваши даты хранятся без времени, все должно быть в порядке. В противном случае попробуйте указать дату как диапазон времени в тот же день (например, start = 00:00, end = 23:59), если gte не работает.
аналогичный вопрос
источник
$gte
вместоgte
него будет лучше.Вы можете использовать следующий подход для метода API, чтобы получить результаты за определенный день:
# [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'
источник
У нас была проблема, связанная с дублированием данных в нашей базе данных, с полем даты, имеющим несколько значений, где мы должны были иметь 1. Я подумал, что добавлю способ решения проблемы для справки.
У нас есть коллекция под названием «данные» с числовым полем «значение» и полем «дата». У нас был процесс, который мы считали идемпотентным, но в итоге при втором запуске добавлялись два значения в день:
{ "_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")}
Нам нужна только одна из двух записей, поэтому пришлось прибегнуть к javascript для очистки базы данных. Наш первоначальный подход заключался в переборе результатов и удалении любого поля со временем между 6 и 11 часами утра (все дубликаты были утром), но во время реализации внесены изменения. Вот сценарий, используемый для его исправления:
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; } }
а затем запустил его с
mongo thedatabase fixer_script.js
источник