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
а сколько всего документов в коллекции?
Каждую минуту добавляется новый
Semeon
yopp
а сколько их уже накопилось?
Semeon
Вот эта штука передаёт
yopp
как выглядит документ?
Semeon
как выглядит документ?
{ "_id": "5da9fa2ef1c2fd2070d320fe", "Date": 1571431517, "City": "City", "Street": "Street", "Temperature": 25.5, "Pressure": 748.8 }
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
В Ubuntu есть apt
Tim
Через Брю автозапуск монго при загрузке системы поставить.
Tim
На виртуалке
Nickolay
Через Брю автозапуск монго при загрузке системы поставить.
Так поставь руками, зачем тебе brew не ясно.
Aʟᴇx
Через Брю автозапуск монго при загрузке системы поставить.
На Ubuntu есть система инициализации, ты можешь написать что-то типа service mongo start
Aʟᴇx
Смотри в документацию по этому поводу, я сходу не подскажу, так как у меня systemd
Nickolay
systemctl enable mongodb.service
Tim
Тут просто нюанс - если нажать Ctrl+C потом при команде mongo ничего не запуститься. Что бы каждый раз не запускать соединение в ручную - она будет запускаться автоматически
Aʟᴇx
Тут просто нюанс - если нажать Ctrl+C потом при команде mongo ничего не запуститься. Что бы каждый раз не запускать соединение в ручную - она будет запускаться автоматически
Можешь подробнее обьяснить или показать скриншот, чтобы у нас было больше контекста и понимания что ты делаешь?
Aʟᴇx
Почему ты запускаешь монгу в виртуалке? У тебя мак?
Aʟᴇx
Если да, то почему бы просто не запустить монгу в контейнере, если тебе нужна изоляция?
Aʟᴇx
У монги есть готовый докер-образ, просто скопировал пару команд, конфигов, вставил - и все работает
Alex
Ребята, всем привет! А не подскажете, как сделать, чтобы _id был типа Number, а не вида "ads7fasdfas7dfasdfasdf"?
Alex
А для чего?
Чтобы не создавать еще один проперти с человеческими id
Aleksandr
опыт показывает что для людей лучше создать
Aleksandr
если им надо
Aleksandr
а родной ид лучше оставить как есть
Aʟᴇx
Ребята, всем привет! А не подскажете, как сделать, чтобы _id был типа Number, а не вида "ads7fasdfas7dfasdfasdf"?
Нужно генерить их client-side. Если генерить id числами, то будет сложнее масштабировать, и сторонние лица смогут оценить количество записей в базе. Если это не риск, то просто можно отослать документ вида: {_id: n}
Alex
а родной ид лучше оставить как есть
Просто тогда придется много логики менять, а этого не хотелось
Aleksandr
типа все работает давно и вдруг не хватает только этой целочисленности у ид?
Alex
А кому нужен человеческий айди?
Менеджеру проще смотреть на человеский вид, чем на хеш
Aleksandr
ну и сделай ему поле
Aleksandr
а _id не показывай
Alex
ну и сделай ему поле
Тогда логику на фронте придется менять, а этого не хотелось бы
Aleksandr
_id заменить везде в исходниках на id ?
Aleksandr
это чтоли сложно
Aʟᴇx
Менеджеру проще смотреть на человеский вид, чем на хеш
Сорри, а "менеджер" правда оставил такой фидбек?
Aʟᴇx
На многих проектах люди живут и с UUID и им нормально. Дело в том, что нет преймуществ у числовых id
Aleksandr
Все равно это работа
это глобал реплейсом 1 секунда
Aʟᴇx
Все равно это работа
Без работы не будет результата, к сожалению 🙈
Alex
Тем не менее, как сделать числовой тип у _id?)
Aʟᴇx
Ну как миниму читаемость)
Большие числа тоже становятся не читаемыми
Tim
У монги есть готовый докер-образ, просто скопировал пару команд, конфигов, вставил - и все работает
Я иду по курсу обучения. Там устанавливают Mongodb и говорят что необходимо установить homebrew для автоматического соединения с бд. Т.к есть локальная монго, облачная и серверная - при подходе с homebrew соединяет автоматически со всеми
Aʟᴇx
{_id: 23432} вместо {_id: ObjectId('...')}