2017-02-17 3 views
1

У меня есть проблема, но у меня нет идеи, как ее решить. У меня есть коллекция PointValues ​​в MongoDB. PointValue схема имеет 3 параметра:Найти документы в MongoDB с нестандартным пределом

  • DataPoint (ссылка на DataPoint схемы)
  • значение (Number)
  • времени (Date)

Существует один pointValue за канун час (24 в день).

У меня есть метод API для получения PointValues ​​ для указанных DataPoint и временной диапазон. Проблема в том, что мне нужно ограничить ее до 1000 очков. Типичный метод ограничения (1000) не является хорошим способом, потому что мне нужна точка для целого, заданного временного диапазона, с шагом времени зависит от заданного времени и количества точек.

Так ... например:

Запрос данных за 1 год = 1 * 365 * 24 = 8760 Она должна возвращать 1000 значений, но примерно 1 значение в (24/(1000/365)) = ~ 9 часов

У меня нет идеи, какой метод я должен использовать для фильтрации этих данных в MongoDB.

Спасибо за помощь.

ответ

1

Отбор проб точно как в базе данных было бы довольно трудно сделать и, вероятно, не очень показательно. Но вариант, который дает вам , аналогичный результат должен был бы использовать конвейер агрегации, который $group - $first best value - $year, $dayOfYear, and $hour (and $minute and $second if you need smaller intervals). Таким образом, вы можете выбирать значения по шагам времени, но ваш выбор длины шагов ограничивается тем, что у вас есть для операторов даты. Таким образом, «почасовые» образцы просты, но «9-часовые» образцы усложняются. Когда этот запрос является критичным для производительности и частым, вы можете рассмотреть возможность создания дополнительных коллекций ежедневно, ежечасно, точно и так далее. DataPoint s, поэтому вам не нужно выполнять эту агрегацию по каждому запросу.

Но ваши документы довольно легкие из-за того, что фактическая полезная нагрузка находится в другой коллекции. Таким образом, вы можете подумать о том, чтобы получить все результаты в запрошенном временном интервале, а затем выполнить пропуски на прикладном уровне. Возможно, вы захотите объединить это с описанной выше агрегацией для предварительного сокращения набора данных. Таким образом, вы можете сначала использовать конвейер агрегации для получения ежечасных результатов в приложении, а затем пропустить результат набора с шагом в 9 документов. Независимо от того, имеет ли это значение, зависит от того, сколько документов вы ожидаете.

Также не забудьте создать отсортированный индекс на поле time.

Смежные вопросы