Vladislav
Вот немножко за агрегацию стремно просто)
yopp
«За агрегацию стремно» это плохая постановка задачи. Если у вас уже есть данные, то составьте план запросов, поднимите тестовый стол, залейте туда данных и проверьте ваш план
Vladislav
Да вот сейчас этим и будем заниматься. Просто сложилось ощущение (надеюсь, что ошибочное), что аггрегацией в MongoDB стоит заниматься только в крайних случаях))
yopp
Вы поймите, что волшебства не бывает. Если вам надо суммировать 100 миллионов значений, это будет примерно везде одинаково медленно, просто в зависимости от реализации порядки «медленно» будут разными
yopp
Если у вас такие запросы это редкая аналитика, это одна задача
yopp
Если это часть дешборда, и вам надо крутить большие объемы очень сложных запросов это другая задача. Но вам будет больно примерно одинаково с любым хранилищем
yopp
Просто болеть будет в разных местах
Vladislav
Вы поймите, что волшебства не бывает. Если вам надо суммировать 100 миллионов значений, это будет примерно везде одинаково медленно, просто в зависимости от реализации порядки «медленно» будут разными
Про волшебство-то понятно. Тут главное, чтоб та же самая задача при одинаковых объемах решалась не медленее, чем в Postgres) и все). А эти сегменты нужны для того, чтоб по ним емейлы или пуши слать. То есть пользователь может подождать))
yopp
Если переложить из пг как есть, то вероятнее всего будет гораздо хуже
Vladislav
Но тут я хотел задать вытекающий вопрос. Если мне по определнному условию нужно определить, показывать ли ОДНОМУ пользователю попап на сайте или нет (то есть уже realtime). Костыльно ли будет решение к тому же пайплайну в начало добавить стадию $match: { session_id: "<КАКОЙ-ТО ID сессии>"} ?
Vladislav
А остальное оставить как есть?
Vladislav
Если переложить из пг как есть, то вероятнее всего будет гораздо хуже
Ну это понятно, что не в табличной форме перекладывать. Как раз и хотим поэтому на монгу перейти, потому табличная форма плохо подходит))
yopp
У вас какое-то предубеждение против AF
yopp
Нет ничего костыльного. Костылем с натяжкой можно считать map/reduce и $expr
yopp
А все остальное или решает вашу задачу или не решает
yopp
Без данных перед глазам и плана запросов тяжело что-то сказать. Могу только сказать что у документных хранилищ есть определённая кривая обучения и сначала будет очень трудно перестроить мышление
yopp
Например в вашем случае мне кажется более разумным считать агрегаты сразу, потому что затраты на математику можно амортизировать в обновлении.
yopp
По агрегатам можно будет построить индексы, что позволит делать более эффективные выборки
yopp
Но это абстрактный кейс в вакууме
yopp
https://db-ai.co приходите, я вам помогу провалидировать насколько монга подходящее решение
Vladislav
Спасибо)
Vladislav
Извиняюсь. Последний вопрос на сегодня))) А если мне нужно посчитать сумму покупок (purchases) за опр. диапазон дат : то тут уже reduce использовать нобходимо?
Vladislav
db.atrn.aggregate( [ { $addFields: { purchaseSum: { $sum: "$purchases.price" }, viewsSum: { $sum: "$views.count" } } }, { $match: { purchaseSum : { $gt : 200}, viewsSum : {$lt: 100} } } ])
Vladislav
Весли у вас документы по времени сгруппированы то $group
Ну наверное не совсем. В каждом документе будет массив объектов purchases: [{date:ISODate("..."), sum:200}, {date:ISODate("..."), sum:540}, ..... ]
Vladislav
И для каждого корневого документа нужно, грубо говоря, посчитат сумму покупки за опр. диапазон даты))
Roman
привет! правильно ли я создал индексы?
Roman
this.db.collection('sources').createIndexes([ { key: { shortcode: 1 } }, { key: { enabled: 1 } } ]).catch((err) => { console.error(err); }); this.db.collection('visits').createIndexes([ { key: { uuid: 1 } }, { key: { source: 1 } } ]).catch((err) => { console.error(err); });
Nick
привет! правильно ли я создал индексы?
Индексы строят под запросы, так что стоит начать с них. Посмотрите экплейны с индексами и без них https://docs.mongodb.com/manual/reference/method/cursor.explain/
Roman
или вдруг монга не индексирует сейчас ничего
Nick
я имею ввиду, правильно ли они создались
Сдается мне вы пытались составной индекс сделать, тогда неправильно
Vladislav
В чем сакральный смысл хранить покупки массивами?
Хм. А как еще? ну, если что, мы не интернет-магаз пилим)) А систему, позволяющую отслеживать покупки на сайте и не только покупки. (Просто за покупки как раз таки сейчас стремнее всего))). А так же строить по этим данным сегменты, рекомендации и т. д. Ну это в кратце
Vladislav
По какому принципу вы укладывакте покупки в док, а то из названия коллекции не ясно
В монгу - пока ни в каком. Сейчас просто экспериментируем. Сейчас в постгресе это. Ну, грубо говоря, когда человек нажимает на кнопку Купить на сайте, из js-скрипта посылается запрос о том, что товар добавлен в корзину. Там по идентификатору сессии в монге нужно будет найти нужный документ (содержащий все данные об этом пользователе) и в коллекцию purchases добавить объект
Vova
Кто-нибудь может показать реальный пример использования? update совместно с aggregation.
Vova
Интересует конкретно применение в updateOne/Many, не runCommand и не db.aggregate
Vlad🍁
Как забиндить localhost и какой-то сторонний IP в конфиге?
Vlad🍁
Любое значение, кроме 127.0.0.1 и 0.0.0.0 при рестарте mongod, его крашит
Vlad🍁
Vlad🍁
В скобках крашит
Vlad🍁
В кавычках крашит
Vlad🍁
Абсолютно любое значение кроме двух выше
Ivan
ищи issue
Ivan
net: port: 27017 bindIp: 127.0.0.1,{{ mongo_listen_addr }} у меня вот такой шаблон работает отлично
Vlad🍁
{{ mongo_listen_addr }}
Vlad🍁
Что это означает?
Ivan
3.6, 4.0
Ivan
{{ mongo_listen_addr }}
в этой переменной IP адрес самой ноды
Ivan
адрес, который существует на машине с монгой
Vlad🍁
Окей, сохраняю файл
Ivan
и на котором тебе надо, чтобы монга работала
Vlad🍁
yopp
Интересует конкретно применение в updateOne/Many, не runCommand и не db.aggregate
AF не применим в контексте findAndModify. Изменение существующих документов через AF возможно только в 4.2 и только через $merge
Ivan
Окей, сохраняю файл
прочитай подробнее лог, journalctl -fu mongod
Vlad🍁
Vlad🍁
Если что вот версия
Ivan
кто-то уже слушает этот порт?
yopp
Если что вот версия
Найдите лог монги
Vlad🍁
Говорю, что при значениях локалхоста и 0.0.0.0 монгод запускается и работает
yopp
Или stdout/err из процесса
Ivan
Да, видимо текст там основной, логирование в файл настроено. /var/log/mongod/mongo*.log
Vlad🍁
Vlad🍁
Вот конец
Vlad🍁
Это было начало лога, извиняюсь
Ivan
Вот конец
ip a | grep 216.233
Vlad🍁
Пусто
Vlad🍁
Это IP моего ПК
Ivan
О чём тебе монга и говорит. Адрес должен быть на машине, на которой монга запущена
Vlad🍁
https://docs.mongodb.com/manual/core/security-mongodb-configuration/
Vlad🍁
Разве тут не написано, что можно внешний IP добавлять?
Vlad🍁
Так понял внешние IP только через 0.0.0.0 и включение auth?
Ivan
Разве тут не написано, что можно внешний IP добавлять?
Можно, если этот адрес есть на интерфейсе, где запущена монга
Ivan
Ты по-моему запутался. Что ты хочешь сделать-то?
Vlad🍁
Хотел сделать доступ к монго по внешнему IP (именно внешнему, а не на машине, как это реализовано в MySQL)
Vlad🍁
Чтобы я мог использовать БД только с локалки или с моего ПК и нигде больше
Vlad🍁
Но раз так нельзя, то придется ставить bindAll