MongoDB /Mongoose запрашивает на конкретную дату?

Можно ли запросить конкретную дату?

Я обнаружил в кулинарной книге монго, что мы можем сделать это для диапазона Запрашивая диапазон дат Вот так:

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

Но возможно ли это на конкретную дату? Это не работает:

db.posts.find({"created_on": new Date(2012, 7, 14) })
108 голосов | спросил Unitech 15 PM00000080000004831 2012, 20:35:48

6 ответов


0

Это должно сработать, если даты, которые вы сохранили в БД, не имеют времени (просто год, месяц, день).

Скорее всего, сохраненные вами даты были new Date(), включая компоненты времени. Чтобы запросить это время, необходимо создать диапазон дат, включающий все моменты дня.

db.posts.find( //query today up to tonight
  {"created_on": {"$gte": new Date(2012, 7, 14), "$lt": new Date(2012, 7, 15)}})
ответил rdrey 15 PM00000080000000631 2012, 20:40:06
0

Для тех из нас, кто использует 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.

ответил Pier-Luc Gendreau 24 WedEurope/Moscow2014-12-24T21:40:09+03:00Europe/Moscow12bEurope/MoscowWed, 24 Dec 2014 21:40:09 +0300 2014, 21:40:09
0

Вы пробовали:

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

Проблема, с которой вы столкнетесь, заключается в том, что даты хранятся в виде меток времени в Mongo. Итак, чтобы соответствовать дате, вы просите, чтобы она соответствовала метке времени. В вашем случае я думаю, что вы пытаетесь сопоставить день (т.е. с 00:00 до 23:59 на определенную дату). Если ваши даты хранятся без времени, то все будет в порядке. В противном случае попробуйте указать свою дату в качестве диапазона времени в тот же день (т. Е. Начало = 00: 00, конец = 23: 59), если gte не работает.

похожий вопрос

ответил Michael D Johnson 15 PM00000080000004931 2012, 20:48:49
0

Да, объект Date собирает дату и время, поэтому сравнение его с просто значением даты не работает.

Вы можете просто использовать $ где оператор для выражения более сложных условий с помощью логического выражения Javascript:)

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

created_on - поле даты и времени, а 2012-07-14 - указанная дата.

Дата должна быть точно в формате ГГГГ-ММ-ДД .

Примечание. Используйте $where экономно, это влияет на производительность.

ответил Faisal Hasnain 3 Jpm1000000pmFri, 03 Jan 2014 23:26:08 +040014 2014, 23:26:08
0

Вы можете использовать следующий подход для метода 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'
ответил Daniel Kmak 15 Jam1000000amThu, 15 Jan 2015 00:57:00 +030015 2015, 00:57:00
0

У нас была проблема, связанная с дублирующимися данными в нашей базе данных, с полем даты, имеющим несколько значений, где мы должны были иметь 1. Я решил добавить способ, которым мы решили проблему для справки.

У нас есть коллекция под названием «data» с числовым полем «value» и полем «date» для даты. У нас был процесс, который мы считали идемпотентным, но в итоге мы добавили 2 значения в день при втором запуске:

{ "_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")}

Нам нужна только 1 из 2 записей, поэтому пришлось прибегнуть к 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

ответил Brett 23 Maypm13 2013, 12:50:21

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132