倫太郎
А как он должен работать?
Gleb
это я к тому, что есть ли разница в работе без монгуса или нет
倫太郎
Ну, в плане?
Gleb
может просто есть очевидные моменты. если нет, то тогда щас распишу кейс
倫太郎
Монгуз на нативном драйвере работает так-то
倫太郎
Gleb
да, щас
Gleb
короче есть коллекция тикетов. есть коллекция сообщений. у каждого сообщения назначен тикет через ref. мне нужно получить сколько-то тикетов и к ним получить последние 3 сообщения сейчас покажу как у меня это выглядит
Gleb
let tickets = await Ticket.aggregate([ { $match: { opened: true}}, { $lookup: { from: 'messages', let: { tid: '$_id' }, pipeline: [ { $sort: { createdAt: -1 } }, { $limit: 3 }, { $match: { $expr: {ticket: '$$tid' }}}, ], as: 'messages' } }, ])
倫太郎
А шо не так?
Gleb
он выдает месседжи только по одному тикету, который был первым в запросе
倫太郎
Ну значит не матчится
Gleb
то есть в итоге в каждом тикете у меня получаются месседжи для одного первого тикета
Gleb
дап ) в этом и вопрос. не пойму где криво
Gleb
читаю доку, вроде все верно делаю
倫太郎
А у тебя в pipeline $match идёт последним, так должно быть?
Gleb
по тикетам да, иначе не срабатывает сортировка
倫太郎
Ща
Gleb
сорри, по месседжам
倫太郎
Поняо
倫太郎
Вижу
Gleb
поправил, у меня там в let не хватало $
倫太郎
Получилось?
Gleb
нене, не помогает
倫太郎
Пиши $match: { $expr :{ $eq:['$ticket', '$$ttid']}}
倫太郎
Пробуй так
Gleb
теперь в пером тикете есть, а в остальных пусто
倫太郎
Ты match вверх передвинь, как я понял. Он же там лимитит сразу и потом матчит
倫太郎
Мб поэтому
Gleb
щас
Gleb
вот это магия, получилсоь
Gleb
спасибо милый человек )
倫太郎
Нутак сначала ты ищешь совпадения, а только потом лимитишь и сортируешь. И на производительности тоже сказывается положительно
倫太郎
И да: match > limit > sort
倫太郎
В таком порядке
Gleb
да, но если не ставить sort первым, то он мне сортит уже получившейся аррей
倫太郎
А, точно
Gleb
а мне месседжи нужно с конца
倫太郎
Дада
倫太郎
Лан, я споть
Gleb
короче все пашет как надо ) спасибо
倫太郎
👍
Max
Привет! попробую ещё тут спросить:
Max
mongoose.connection.on('connected', async () => { log.info(`Mongoose connected to ${process.env.DB_URI}`); const db = mongoose.connection; db.once('open', () => { const changeStream = db.collection('rides').watch(); changeStream.on('create', async () => console.log('!!!1')); changeStream.on('change', async () => console.log('!!!2')); }); }); подскажите плиз, почему при добавлении подписки на монгу у меня сервак начинает отвечать в 10-20 раз медленне
Max
при чём екшены в этот момент не тригерятся - просто сам факт наличия подписки жутко тормозит сервер
AstraSerg
Извините, но в терминах монги нет понятия "подписка".
Max
Извините, но в терминах монги нет понятия "подписка".
буду знать, спасибо. ссылка на то что я называю подпиской
Max
https://docs.mongodb.com/manual/changeStreams/
AstraSerg
А, стримы, это другое дело. Теперь ваш вопрос понятнее. То есть когда ваша апликуха подписывается на ченджстрим, начинаются тормоза?
Max
стесняюсь спросить, а где тут “await” ? или не обязательно его указать?
не обязательно, я забыл убрать - там все операции синхронные
Max
тормоза - Х10 - Х20 раз
AstraSerg
А поток большой? Может так и должно быть?
Max
А поток большой? Может так и должно быть?
нет - там событий не происходит вообще
Max
А поток большой? Может так и должно быть?
да и рекордов мало в сумме - меньше 20
AstraSerg
Так а что тромозит, если ничего не происходит?
Max
любой запрос к монге теперь тормозит
AstraSerg
А, так тормозят запросы к монге, а не апликуха? А какие именно запросы? Может это из-за write concern? https://docs.mongodb.com/manual/reference/write-concern/
Max
и "джойнов" тоже нету - ни через монгуз ни через агрегейшен фреймворк
AstraSerg
там и документов штук по 20-40 в коллекциях
Очевидно, что это не связано с количеством документов
Max
Очевидно, что это не связано с количеством документов
я понимаю. но увы не понимаю как лечить
AstraSerg
Прежде всего нужно обратиться к логам. Повысьте уровень детализации если нужно https://docs.mongodb.com/manual/reference/method/db.setLogLevel/
Max
я по дефолту юзал один конекшен)
Max
и стрим его блочил)
Max
но в любом случае - спасибо!
Max
ок, теперь когда агония прошла - может кто-то подскажет как рассчитать оптимальный размер коннекшенов в пуле?
Nick
ок, теперь когда агония прошла - может кто-то подскажет как рассчитать оптимальный размер коннекшенов в пуле?
настариваете мониторинг, запускаете приложуху, даете нагрузку, смотрите упирается в количество коннектов, если да - увеличиваете, если нет то можно ненмого уменьшить и повторить
Nick
когда разговор о пуле то мониторят приложение а не базу, а точнее использование пула. это уже надо искать конкретно к драйверу и пулу
Sergey
Есть ли какой-нибудь способ безопасно удалить индекс из коллекции? Ну т. е. есть у меня индекс X, который я хочу удалить. Согласно статистике, он довольно активно используется, но, в теории, вместо него может использоваться другой индекс. Запросов разных много. Исчерпывающего списка их шейпов нет. Хочется удалить индекс X, но так, чтобы либо быстренько его вернуть, если что, либо достоверно убедившись, что сможем жить без него. Штуки вроде задизейбливания индексов в монге, насколько мне известно, нет. В кеше планов, насколько я понимаю, есть не все шейпы запросов.
AstraSerg
Нет идей, кроме банального, собрать все типы запросов, попробовать на стенде и .т.п
Sergey
подскажите пожалуйста, есть у меня массив данных цена и дата, я хочу сгрупировать этот массив по дням и подскачитать среднее значение цены