Запросить строковый тип Date в mongodb - PullRequest
3 голосов
/ 16 февраля 2012

Это мой запрос в mongodb

db.order.find ({"ublExtensions.ublExtensions.extensionContent.Metadata
                .ModificationTime": "2012-02-04T01:58:27.861Z"});

Получает результат только для определенного часового пояса. Время модификации меняется ежедневно. У меня есть требование, где мне нужно выбрать данные, которые обновляются сегодня ... означает (sysdate -1 в sql) данных за один день.

Как мне этого добиться в mongodb? Обратите внимание, что моя дата является строковым типом, и у меня есть ограничение, которое я не могу изменить. Кто-то предложил использовать ISODate.

Пожалуйста, помогите в решении этой проблемы.

Ответы [ 3 ]

8 голосов
/ 16 февраля 2012

Mongodb сохраняет свои объекты даты в формате bson, например: {$ date: 1329415205151}

Если вы решили сохранить его в строковом формате, то ответственность за фильтрацию и обработку этого значения лежит на стороне клиента, поскольку mongo рассматривает его как строку. Вы можете преобразовать свои строки в объекты даты, обратившись к этому другому вопросу SO: Как преобразовать свойство в MongoDB из типа текста в тип даты?

Широко рекомендуется хранить все даты в формате UTC или согласованный часовой пояс, возможно связанный с локальным центром обработки данных, а затем преобразовывать значения дат в соответствующий местный часовой пояс на клиенте.

Вы можете сохранить любое значение даты по вашему желанию. Значение даты и формат даты представляют собой две отдельные проблемы. Если ваши ограничения требуют, чтобы вы сохраняли этот формат даты в документе, рекомендуется также сохранить объект $ date во время обновления.

5 голосов
/ 27 ноября 2012

Я бы порекомендовал хранить ваши даты в качестве даты или ISODate на MongoDB, так как это облегчит вашу жизнь:)

Если это невозможно, то на стороне клиента (драйвер, зависящий от языка программирования) вы сможете проанализировать строку с подходящим типом Date.

Однако, если вам нужен запрос для запуска в оболочке mongo, вы можете следовать стратегии, аналогичной описанной в Mongo Cookbook

1) Создание переменной с текущей и вчерашней датой:

>var today = new Date();
>today
ISODate("2012-11-26T22:12:03.870Z")
>var yesterday = new Date()
>yesterday.setDate(today.getDate() - 1)
>yesterday
ISODate("2012-11-25T22:12:03.870Z")

2) Сформировать запрос для поиска документов в течение 24 часов

>db.order.find( { "ublExtensions.ublExtensions.extensionContent.Metadata.ModificationTime" : { $gte : yesterday, $lt : today } } )
0 голосов
/ 11 ноября 2017

Почему вы не можете просто использовать $gt запрос, и для сравнения времени вы можете использовать Date.now(), и с этого Date.now() вы можете использовать предыдущую дату, например, если текущая дата "2017-05-16T02:08:48.419+05:30", вы напишите запрос

db.collection.find({"createdAt": { $gte : new ISODate("2017-05-15T02:08:48.419+05:30") }})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...