CybernatiC
Как сделать Distinct в Agregate?
Askhat
Как сделать Distinct в Agregate?
Глянь в доке. Там есть инфа про это
CybernatiC
У кого был опыт создания 1 к 1 мессенджера?
CybernatiC
как получить список переписок?
CybernatiC
я пытаюсь вытащить из таблицы СООБЩЕНИЯ все сообщения которые были отправлены юзерайди или ПОЛУЧЕНЫ юзерайди
CybernatiC
теперь необходимо уникализировать записи чтобы вытащить не все переписки а только дистинктивные по одному сообщению к переписке между юзером 1 и 2 и например 2 и 3
Nick
как получить список переписок?
лучше всего хранить список переписок в самом юзере, а не собирать их по сообщениям
CybernatiC
что вы вкладываете в понятие "дистинктивные"?
уникальные переписки, одна запись на переписку пользователя с каким нибудь другим пользователем
CybernatiC
group by
Nick
тогда как выше - храните список отдельно от самих сообщений
CybernatiC
как лучше их хранить? какие поля там должны быть?
CybernatiC
подскажите структуру таблицы
CybernatiC
Внутри юзера
Когда юзер А начинает переписку с юзером Б у обоих юзеров обновить коллекцию conversations: [] и сделать туда ПУШ ID?
Nick
Да
CybernatiC
Первому добавить второй второму первый
CybernatiC
при пуше дублей не будет да уже?
Nick
при пуше дублей не будет да уже?
Смотря как сделаете, вы же сначала создавать беседу будете, а потом уже сообщения слать. Тут вы сможете перед начало разгоаора чекнуть создан он уже или нет. Плюс это можно использовать для отображения списка диалогов и просто их продолжать
CybernatiC
Я думаю в action add message на сокете делать апдейт юзеров и обновить их коллекцию
CybernatiC
Юзер А нажал написать Юзеру Б. Набрал сообщение и нажал ОТПРАВИТЬ. В этот момент я у обоих юзеров сделал бы апдейт их поля conversations где у друг друга указал бы айди
Nick
Юзер А нажал написать Юзеру Б. Набрал сообщение и нажал ОТПРАВИТЬ. В этот момент я у обоих юзеров сделал бы апдейт их поля conversations где у друг друга указал бы айди
Юзер а нашел юзера б в поиске, значит между ними не было разговоров, иначе бы он его нашел в списке диалогов. Значит с клиента прилетает флаг что диалог стартует из поиска. На бэке по этому флагу производится сверка отсутвия такого диалога у обоих юзеров, проводится поиск ЧС например и другие проверки на допустимость начать диалог, после чего добавляются в списки начатых диалогов. И уже после этого начинается сохранение самого сообщения
Nick
Для UX можно сделать создание диалога у юзера б только когда в разговоре появляется первое сообщение, чтобы у юзеров не было кучи пустых разговоров
Mike
А чем такая архитектура лучше если бы сообщения отдельно хранились в коллекции сообщений?
Nick
Для этого пишите юзерские сценарии, как юзер будет видеть события и как оно должен взаимодействовать с приложением. После этого уже приступаете к реализации
Mike
Они и так хранятся отдельно
Я понял что они в массиве у юзера
Nick
Я понял что они в массиве у юзера
Список диалогов у юзера
Tommy
как в $lookup сделать ограничение/лимит нанпрмиер чтобы обединить 2 документа?
CybernatiC
Агригат
Tommy
есть пример?
Tommy
let recipes = await Recipe .aggregate([ { "$addFields": { "_id": { "$toString": "$_id" } } }, {$lookup: { from: "likes", localField: "_id", foreignField: "recipeId", as: "likes" } } ])
Tommy
например мне нужно чтобы в массиве likes было 5 документов
Tsikhan
добрый вечер! база монги занимает 3тб, удалил в одной коллекции данных на 1тб, но на слейве это изменение не прошло... в чем может быть проблема?
Anonymous
rs.status() ?
Dmitry
.
Dmitry
сделал
Max
Добрый день! Насколько сильно влияет project на скорость выполнения запроса? Есть жирные документы в коллекциях, думаю обрезать лишние... пока разницу не особо замечаю
Nick
Добрый день! Насколько сильно влияет project на скорость выполнения запроса? Есть жирные документы в коллекциях, думаю обрезать лишние... пока разницу не особо замечаю
То что вы обрезаете часть полей скажется только на занимаемой памяти во время агрегации и количестве трафика. С диска будут вычитаны документы полностью
Max
То что вы обрезаете часть полей скажется только на занимаемой памяти во время агрегации и количестве трафика. С диска будут вычитаны документы полностью
ok,понял. хм, а есть ли какой-то способ снизить I/O на диск в самых запросах? или только менять "модель"даных?
Alex
Можете менее используемые части вынести в дргугую коллекцию и цеплять ее по FK
Nick
ok,понял. хм, а есть ли какой-то способ снизить I/O на диск в самых запросах? или только менять "модель"даных?
Только менять модель или сужать выборки. Можно еще делать предагрегаты или вообще завести кэш вне монги
Max
Только менять модель или сужать выборки. Можно еще делать предагрегаты или вообще завести кэш вне монги
хм, а что такое пред-агрегаты? ну про кеш понятно, только как его лучше реализовать?
Alex
Если проект большой и данных много, то использовать и предагрегаты и внешние кеши
Alex
хм, а что такое пред-агрегаты? ну про кеш понятно, только как его лучше реализовать?
А вас сильно ограничивают в ресурсах? И рельно данных много или просто задел на далекое будущее?
Max
вообще какая-проблема - есть жирная коллекция в документах которых кроме прочих даных лежит массив координат.. всё было норм, пока не начали собирать статистику
Max
проблема реальная - на атласе уже ворнинги на I/O - выше 70-80%
Max
подняли пока план до 32 Гб оперативы)
Max
но это накапало за несколько месяуев
Max
А в данный момент все хранится в одной коллекции?
да, уже была идея разнести это на две коллекции
Max
даже не так - одну оставить как есть, а во вторую - дублировать только нужные данные
Alex
Да не, просто я знаю, что бывают проблемы, когда из монги пытаются делать реляционную базу и все начинает очень медленно работать
Nick
хм, а что такое пред-агрегаты? ну про кеш понятно, только как его лучше реализовать?
Имеется ввиду, что на самые тяжелые запросы делается доп коллекция и данные туда заносятся вместе с основной коллекцией, но в уже подготовленном виде. Например из 50 полей остаются 6, или считаются счетчики или другие агрегаты
Max
Да не, просто я знаю, что бывают проблемы, когда из монги пытаются делать реляционную базу и все начинает очень медленно работать
местами пытаюсь работать как с реляционкой... просто заказчик в своё время упёрся - хочу монгу. а правильно было бы юзать две бд - монгу и постгрес)
Max
сужаем их до нужного количества?
Max
@yatoba @al_web а где про это можно почитать? этому процессу есть общее название?
Max
статти / книжки?
Nick
По типу, это просто подходы к оптимизации
Max
я понимаю, просто может есть общие практики?
Max
Да не, просто я знаю, что бывают проблемы, когда из монги пытаются делать реляционную базу и все начинает очень медленно работать
у нас паплайны местами на 400 строчек и с десяток лукапов =), ещё и динамически генерятся)
Alex
у нас паплайны местами на 400 строчек и с десяток лукапов =), ещё и динамически генерятся)
Ну это норм такая нагрузка, мне кажется, что только реорганизация базы вас спасет)
Max
Ну это норм такая нагрузка, мне кажется, что только реорганизация базы вас спасет)
ок, а есть какие-то удобные инструменты для поиска конкретных запросов которые делают БД больно?
Max
хотя ладно, слишком много вопросов)
Max
спасибо!
Alex
.explain()
Nick
Хм, у меня както больше все на опыте. Но база это понимание нлрмальных форм при работе sql https://ru.m.wikipedia.org/wiki/Нормальная_форма
Nick
Она применима к данным вообще никак не ограничиваясь компьютерами, вплоть до записей в вашем блокнотике
Назар
Всем привет. Можно ли вставить документ в другой документ? Просто как вложенный обьект, но чтоб монго сгенерило _id?