запрос даты или времени с помощью mongoDB - PullRequest
2 голосов
/ 20 октября 2011

У меня есть коллекция с документами, которые имеют свойства 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 Ответ

1 голос
/ 21 октября 2011

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

  • Сохраните начальный час и конечный час как дополнительные атрибуты для сохранения часа / минут.
  • Применение составных индексов к 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, чтобы разделить компоненты в новую коллекцию и использовать эту новую коллекцию в будущем.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...