запрос даты или времени с помощью MongoDB

#mongodb

#mongodb

Вопрос:

У меня есть коллекция с документами, которые имеют свойство start_time и end_time. структура документа выглядит следующим образом:

 {
_id     "4e9650ed1d41c811bc000000"
bid     31.0
start_time  2011-04-04 09:30:00 UTC
volume  31.0
end_time    2011-04-04 09:59:59 UTC
ask     0.0
price   1329.75
}
  

Я хочу иметь возможность разделять поля даты на компоненты даты и времени и запрашивать каждое отдельно. Примером запроса может быть:

Получите мне все документы, которые находятся между (9:00 и 9:30) и между (2011-04-04 и 2011-05-04)

Ответ №1:

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

  • Сохраните начальный и конечный часы в качестве дополнительных атрибутов, чтобы сохранить час / минуты.
  • Примените составные индексы для start_time, start_hour и end_time, end_hour, чтобы повысить производительность поиска.
  • Запустите запрос по всем четырем полям.

См. Пример документа:

 { 
  _id: "4e9650ed1d41c811bc000000", 
  bid: 31.0,
  start_time: 2011-04-04 09:30:00 UTC,
  start_hour: "09:30:00",  // new field
  volume: 31.0,
  end_time: 2011-04-04 09:59:59 UTC,
  end_hour: "09:59:59",    // new field
  ask: 0.0 ,
  price 1329.75 
}
  

Похоже, что ответ на ваши вопросы заключается в том, что вы не можете эффективно разделять компоненты даты и времени в своем запросе и, например, использовать индексы для ускорения запросов.

Мое предложение выше требует незначительного изменения вашей схемы для достижения того, что вам нужно. Кажется, что это окупится в значительной степени за пожертвование несколькими дополнительными байтами в каждом документе и незначительными изменениями кода.

Если у вас есть существующие данные, вы можете запустить Map / Reduce, чтобы разделить компоненты в новую коллекцию и использовать эту новую коллекцию в будущем.

Я надеюсь, что это поможет.