MongoDB: запрос по дате - PullRequest
       4

MongoDB: запрос по дате

2 голосов
/ 31 октября 2010

В базе данных MongoDB у меня есть коллекция предметов, и у каждого предмета хранится дата создания. Мне нужно запросить эту коллекцию по дате. Я попробовал:

db.items.findOne({date:{new Date(1285947037*1000)}})

но ничего не возвращается. Я получил эту временную метку, используя PHP ($date->sec, где $date - это MongoDate объект из базы данных). Так каков правильный способ сделать это? Спасибо.

Ответы [ 2 ]

6 голосов
/ 31 октября 2010

Конструктор Date ожидает отметку времени в миллисекундах .Отметка времени 1285947037 указана в секундах , поэтому вы умножаете ее на 1000.

Я предполагаю, что фактическая отметка времени в документе содержит миллисекунды, например, 1285947037461 (обратите внимание на 461 в конце).Вы умножаете секунды на 1000, что приводит к 1285947037000.Как видите, эти временные метки не равны:

1285947037461 // actual timestamp in MongoDB
1285947037000 // value you calculated

Проблема заключается в классе MongoDate: он теряет точность в миллисекундах, как вы можете прочитать в документации ,Вот цитата:

[...] это означает, что любая точность, превышающая миллисекунды, будет потеряна при отправке документа в / из базы данных.

Найтидокумент, который вы ищете, используя метку времени в секундах, вам нужно что-то вроде этого:

db.foo.findOne(function () {
  // round the stored date to seconds and compare to timestamp
  return parseInt(this.date / 1000) === 1285947037
})

Вы можете получить точную метку времени в миллисекундах в консоли, используя myDateObject.getTime().

0 голосов
/ 31 октября 2010

В вашем запросе есть небольшая ошибка; уберите фигурные скобки вокруг new Date(...) и все готово:

db.items.findOne({date: new Date(1285947037*1000)})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...