yopp
начать можно отсюда https://www.mongodb.com/blog/post/paging-with-the-bucket-pattern--part-1
хотя тут немного другая задача, но смысл похожий
yopp
https://www.mongodb.com/blog/post/building-with-patterns-the-bucket-pattern
yopp
общий смысл документны хранилищ — писать так, как вы будете читать
Semeon
Не думал, что это будет так сложно. Я правильно понимаю, что $match теперь не нужен?
yopp
почитайте статьи
Semeon
Спасибо!
yopp
это не очень сложно
yopp
идея просто сгруппировать значения в один документ для одного аттрибута
yopp
вторая ссылка ближе к вашей теме
yopp
только у них там вместо абстрактного value зачем-то сразу temperature
Semeon
Мне как дизайнеру, сложно читать документацию с абстрактным value )
yopp
смысл в том, что у вас будут сразу преагрегированные данные и поиск минимальных и максимальных значений будет решаться просто через find и сортировку
Semeon
Спасибо! Попробую разобраться
yopp
если вам это сложно, то не делайте поиск и минимума и максимума в одной агрегации
yopp
у вас много значений?
Semeon
У меня пока температура и давление. У них минимальное, максимальное и средние значения. Позже ещё добавлю датчиков
Semeon
yopp
Semeon
Semeon
yopp
а сколько их уже накопилось?
Semeon
Вот эта штука передаёт
yopp
как выглядит документ?
Semeon
как выглядит документ?
{
"_id": "5da9fa2ef1c2fd2070d320fe",
"Date": 1571431517,
"City": "City",
"Street": "Street",
"Temperature": 25.5,
"Pressure": 748.8
}
Semeon
Semeon
yopp
пока вы далеко не уехали я вам рекомендую поменять схему. группируйте ваши значения в один документ на час
{
_id: <ObjectID>,
date: Date("округлить до начала часа"),
address_id: <ObjectID>, // из коллекции addresses, где уже {_id:, Street:, Address:}
attribute_id: <ObjectID>, // из коллекции attributes, где {_id, type: "Temperature"}
measurements: [
{
date: Date("реальная дата"),
value: <значение>
}
],
min: <минимальное_значение>,
max: <максимальное_значени>,
count: <количество записей в measurements>,
sum: <сумма value из measurements>,
avg: <$div: [$sum, $count]
}
yopp
min, max, count, sum и avg вы будете обновлять при вставке значений, это прямо в запросе можно сделать, чтоб монга сама считала
$min, $max
https://docs.mongodb.com/manual/reference/operator/update/max/#use-max-to-compare-numbers
обновлять sum и count через $inc
https://docs.mongodb.com/manual/reference/operator/update/inc/
yopp
дальше вы сделаете индексы по attribute_id и mesurement.value и сможете мгновенно находить минимальные и максимальные значения и соотвествующие часы
yopp
а дальше отфильровать measurements это дело техники
yopp
и это будет _очень_ просто делать
yopp
вам будет очень просто добавлять новые числовые значения
yopp
в принципе можно и целые сутки хранить в одном документе, но не думаю что в этом есть особый смысл
yopp
за счёт snappy документы будут очень компактные
yopp
и за счёт того что у вас много значений собрано в один документ и индексы по значениям тоже будут компактные
Semeon
Большое спасибо за развёрнутый ответ! Мне всё это нужно перевариать и я попробую пересобрать схему
Tim
Привет. Скажите пожалуйста homebrew под Линукс станет на Ubuntu ?
Aʟᴇx
Aʟᴇx
В Ubuntu есть apt
Tim
Через Брю автозапуск монго при загрузке системы поставить.
Tim
На виртуалке
Nickolay
Aʟᴇx
Смотри в документацию по этому поводу, я сходу не подскажу, так как у меня systemd
Nickolay
systemctl enable mongodb.service
Tim
Тут просто нюанс - если нажать Ctrl+C потом при команде mongo ничего не запуститься. Что бы каждый раз не запускать соединение в ручную - она будет запускаться автоматически
Aʟᴇx
Aʟᴇx
Почему ты запускаешь монгу в виртуалке? У тебя мак?
Aʟᴇx
Если да, то почему бы просто не запустить монгу в контейнере, если тебе нужна изоляция?
Aʟᴇx
У монги есть готовый докер-образ, просто скопировал пару команд, конфигов, вставил - и все работает
Alex
Ребята, всем привет! А не подскажете, как сделать, чтобы _id был типа Number, а не вида "ads7fasdfas7dfasdfasdf"?
RapidCodeLab
Alex
А для чего?
Чтобы не создавать еще один проперти с человеческими id
Aleksandr
опыт показывает что для людей лучше создать
Aleksandr
если им надо
Aleksandr
а родной ид лучше оставить как есть
Aʟᴇx
RapidCodeLab
Aleksandr
Aleksandr
типа все работает давно и вдруг не хватает только этой целочисленности у ид?
Aleksandr
ну и сделай ему поле
Aleksandr
а _id не показывай
Aleksandr
_id заменить везде в исходниках на id ?
Aleksandr
это чтоли сложно
Alex
Alex
Aʟᴇx
На многих проектах люди живут и с UUID и им нормально.
Дело в том, что нет преймуществ у числовых id
Alex
Alex
Тем не менее, как сделать числовой тип у _id?)
Aʟᴇx
Aʟᴇx
{_id: 23432} вместо {_id: ObjectId('...')}