Yurii
Да вродь ни чего критичного https://paste.ofcode.org/qQqTdeQVeCsR2jhpsSz4yK
и если в робомонгу это вставить, то запрос норм отработает?
Yurii
Да вродь ни чего критичного https://paste.ofcode.org/qQqTdeQVeCsR2jhpsSz4yK
кажется, это действительно баг драйвера монги
yopp
если падает процесс mongod это баг в монге
Yurii
если падает процесс mongod это баг в монге
но тогда при запросе от робомонги он бы тоже падал
yopp
нет, соврешенно не факт
yopp
даже если драйвер делает что-то не так, монга должна прислать исключение, а не упасть
Serhii
ну относительно нормально, по крайней мере при отсутсвии колекций не крашится бд. Правда при 800 комнатах и 150к сообщений запрос отрабатывает 25-30 сек. Че не есть гуд(
yopp
вы монгу обновили?
Serhii
yopp
второй момент { $sort: { createdAt: -1 } }, { $limit: 1 },
yopp
у вас по createdAt есть индекс?
Serhii
нету
yopp
я вам настоятельно рекомендую не использовать $lookup
yopp
ваши запросы можно сделать обычным find
yopp
их будет существенно легче отлаживать, будет сразу видно какой из шагов вызывает больше всего проблем
Serhii
да я уже понял что наверное легче будет три запроса сделать чем одну агрегацию с lookup
Serhii
моя любовь к монге сегодня пошатнулась))
yopp
$lookup имеет очень ограниченный скоуп применения
yopp
вы пытаетесь с помощью него что, меньше запросов в базу делать?
Serhii
типа того, да и понядеялся что быстрее отработает
yopp
но вы не делаете меньше запросов. невозможно сделать их меньше :)
yopp
это как join — вы открываете «подкурсор»
yopp
т.е. вы на самом деле просто делаете запрос из запроса
yopp
вы пытаетесь предвратильно оптимизировать и не угадываете где будет бутылочное горлышко.
yopp
выборки медленее не от количества запросов, а от их сложности
yopp
в вашем случае вы выбираете последнее сообщение, но у вас нет индекса по временной отметке. в итоге монге необходимо выбирать все сообщения и сортировать их в памяти
yopp
сделайте индекс по createdAt
yopp
если вы хотите выбирать последнее сообщение в «комнате» то пишите последнее сообщение в документ «комната»
yopp
но на деле, я бы не тратил на это время, а оставил бы несколько запросов. даже если будет N+1 по числу отображаемых чатов, это не проблема
yopp
дайте продукт пользователям и посмотрите где будут проблемы
yopp
вероятнее всего они будут совершенно не там, где вы ожидаете
yopp
и чем проще вы будете делать запросы, тем будет проще будет их отлавливать
yopp
когда у вас будет реальная картина того, что идёт не так на продакшене, можно будет оптимизировать какие-то вещи
Serhii
кстати вариант с хранение последнего сообщени в комнате мне понравился, решает несколько проблем сразу. По поводу нескольких запросов то есть еще одна проблема, как получить сообщения которые к 1000 комнат? Отправлять $in со всеми айдишками?
yopp
кешировать сообщение в комнате это плохой вариант «для начала», потому что это кеширование
yopp
у вас сообщение many-to-many к чатам?
Serhii
быстрее one-to-one, сообщение хранит айди комнаты
yopp
ничего не понял
yopp
т.е. в сообщении хранится только 1 id команты?
Serhii
{ message: "", roomId: "", creatorId: "" } что то типа такого
yopp
тогда не очень понятна проблема «получить сообщения которые к 1000 комнат»
yopp
вы имеет ввиду как получить последнее сообщение для каждой команты, когда их тысяча?
Serhii
не уверен что такой подход нормальный Messages.find({ roomId: { $in: [...1000 id] } })
yopp
а какой в этом смысл?
Serhii
чето я туплю, а как по другому получить сообщения для комнат?
yopp
я не понимаю что вы хотите в итоге получить :)
Serhii
мне нужно получить все комнаты в которых находится юзер и последнее сообщение из этой комнаты
yopp
первым запросом выбираете N комнат, дальше делаете по каждой комнате запрос в messages с sort { createdAt: -1 }, limit 1
yopp
тысячу комнат запрещаете выбирать и делаете пагинацию
yopp
выборку только последних сообщений можно сделать ввиде агрегации по messages, без lookup
yopp
вероятно можно немного ускорить выборку сделав индекс {roomId: 1, createdAt: -1}
yopp
впрочем пересечение тут может оказаться немного выгоднее
yopp
но я бы не парился и сделал два индекса
Serhii
ок, спасибо, сейчас попробую
Serhii
но если чесно последнее сообщение в комнате мне нравится больше)
yopp
это у вас какой-то реальный проект?
Serhii
да
yopp
он уже запущен?
Serhii
нет
Serhii
но скоро планируется
yopp
забейте на оптимизацию
yopp
сфокусируйтесь на скорости разработки, а не на скорости выполнения запросов
yopp
потратье немного времени чтоб в проект повесить observability агента, который умеет профилировать запросы из приложения
yopp
чтоб видеть где оно начинает тормозить
yopp
и делайте как делается, а не как будет быстрее работать. потом, когда придут пользователи (если они вообще придут), у вас будет картина где проблема острее всего и там и будете уже с реальными данными оптимизировать
Maksym
и делайте как делается, а не как будет быстрее работать. потом, когда придут пользователи (если они вообще придут), у вас будет картина где проблема острее всего и там и будете уже с реальными данными оптимизировать
интересный подход, а не получится ли так что для оптимизации нужно будет поменять структуру базы? а в проде это будет сделать уже проблематично
yopp
вы исходите из того, что вы угадаете где будет проблема и сразу сделаете идеально
Serhii
и делайте как делается, а не как будет быстрее работать. потом, когда придут пользователи (если они вообще придут), у вас будет картина где проблема острее всего и там и будете уже с реальными данными оптимизировать
примерно так изначально и делалось, но на финальной стадии когда начали нагрузочные тесты делать все пошло к чертям, вот и доделывается, а что и переделывается
yopp
но если у вас нет живых данных, вам будет _очень_ трудно угадать. это как пытаться выйграть в лотерю
Maksym
вы исходите из того, что вы угадаете где будет проблема и сразу сделаете идеально
ну почему угадаем, можно делать нагрузочные тесты и это вылезет еще на стадии до релиза
yopp
у вас нагрузочные тесты откуда взялись?
yopp
есил у вас продакшена нет :)
yopp
это синтетика
yopp
вы себе придумали какой-то индикатор, который только вам важен
yopp
без реальной нагрузки все гипотезы о том что будет бутылочным горлышком являются гипотезами
yopp
мой подход что надо вкладывать время в инструменты, которые позволят быстро катать патчи
yopp
и видеть что надо патчить, конечно
yopp
а то что вам придётся структуру базы менять, так это 100% гарантия