Vladislav
Вот немножко за агрегацию стремно просто)
yopp
«За агрегацию стремно» это плохая постановка задачи. Если у вас уже есть данные, то составьте план запросов, поднимите тестовый стол, залейте туда данных и проверьте ваш план
Vladislav
Да вот сейчас этим и будем заниматься. Просто сложилось ощущение (надеюсь, что ошибочное), что аггрегацией в MongoDB стоит заниматься только в крайних случаях))
yopp
Вы поймите, что волшебства не бывает. Если вам надо суммировать 100 миллионов значений, это будет примерно везде одинаково медленно, просто в зависимости от реализации порядки «медленно» будут разными
yopp
Если у вас такие запросы это редкая аналитика, это одна задача
yopp
Если это часть дешборда, и вам надо крутить большие объемы очень сложных запросов это другая задача. Но вам будет больно примерно одинаково с любым хранилищем
yopp
Просто болеть будет в разных местах
yopp
Если переложить из пг как есть, то вероятнее всего будет гораздо хуже
Vladislav
Но тут я хотел задать вытекающий вопрос. Если мне по определнному условию нужно определить, показывать ли ОДНОМУ пользователю попап на сайте или нет (то есть уже realtime). Костыльно ли будет решение к тому же пайплайну в начало добавить стадию $match: { session_id: "<КАКОЙ-ТО ID сессии>"} ?
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}
}
}
])
yopp
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/
Nick
Roman
Roman
или вдруг монга не индексирует сейчас ничего
Vladislav
В чем сакральный смысл хранить покупки массивами?
Хм. А как еще? ну, если что, мы не интернет-магаз пилим)) А систему, позволяющую отслеживать покупки на сайте и не только покупки. (Просто за покупки как раз таки сейчас стремнее всего))). А так же строить по этим данным сегменты, рекомендации и т. д. Ну это в кратце
Nick
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, его крашит
Ivan
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
адрес, который существует на машине с монгой
Vlad🍁
Ivan
и на котором тебе надо, чтобы монга работала
Vlad🍁
Ivan
прочитай подробнее лог, journalctl -fu mongod
Vlad🍁
Vlad🍁
Ivan
кто-то уже слушает этот порт?
Vlad🍁
yopp
Vlad🍁
Говорю, что при значениях локалхоста и 0.0.0.0 монгод запускается и работает
yopp
Или stdout/err из процесса
Ivan
Да, видимо текст там основной, логирование в файл настроено.
/var/log/mongod/mongo*.log
Vlad🍁
Vlad🍁
Vlad🍁
Это было начало лога, извиняюсь
Ivan
Vlad🍁
Пусто
Vlad🍁
Это IP моего ПК
Ivan
О чём тебе монга и говорит.
Адрес должен быть на машине, на которой монга запущена
Vlad🍁
https://docs.mongodb.com/manual/core/security-mongodb-configuration/
Vlad🍁
Разве тут не написано, что можно внешний IP добавлять?
Vlad🍁
Так понял внешние IP только через 0.0.0.0 и включение auth?
Ivan
Ты по-моему запутался. Что ты хочешь сделать-то?
Vlad🍁
Хотел сделать доступ к монго по внешнему IP (именно внешнему, а не на машине, как это реализовано в MySQL)
Vlad🍁
Чтобы я мог использовать БД только с локалки или с моего ПК и нигде больше
Vlad🍁
Но раз так нельзя, то придется ставить bindAll