#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, чтобы разделить компоненты в новую коллекцию и использовать эту новую коллекцию в будущем.
Я надеюсь, что это поможет.