Maksym
В этом случае предпочтительнее будет 2 коллекции сделать. А в пользователях хранить ссылку на id компании.
Вот так в итоге и сделали, теперь встряли когда нам надо удалить компанию и надо ж как-то атомарность операции поддержать, т.е. удалить компанию и соответственно обнулить идшки в пользователях, а монго транзакции не поддерживает. Теперь по идее надо заморочиться с two phase commit и это вообще не прикольно.
yopp
ойвей
yopp
2pc это для сильных духом, но вероятнее всего вы его убётесь делать
yopp
транзакции уже есть, обновитесь до 4.0. но пока только в репликах, в шардах будет через годик
yopp
зачем вам атомарность в пользователях?
yopp
вы вообще можете ничего не обнулять
yopp
если источника связи нет, то какая разница что там в поле
yopp
связуемого документа то нет
Maksym
Хм, интересно я об этом как-то не подумал.
yopp
единственный момент — обновление связей, тут есть шанс что где-то посредине операцию грохнут и часть документов не обновится. но это решается write concern
yopp
и retry
Maksym
Короче щас я думаю, что надо наверное все таки было компанию в пользователей запихивать. Ну сколько там тех пользователей будет потенциально ну пусть 100к не так уж это и долго будет выбрать компании из пользователей. Или нет все таки?
yopp
если у вас такие связи, то лучше не вкладывать документы
Maksym
Понял
yopp
я вообще рекомендую начинать с коллекции на каждую модель данных
yopp
вкладывать с самого начала стоит только те вещи, которые в самой модели вложенные
yopp
например адрес доставки, список телефонов и так далее
yopp
товары в корзине
Maksym
Понятно, блин ну это ты мой мозг взорвал конечно, что связи можно не обновлять.
yopp
лучше обновлять конечно, но даже если она не обновится, ничего страшного не будет
Андрей
Привет Есть две коллекции, из одной я вытаскиваю id документов, чтобы вытащить из другой документы, в которых есть эти id. Хотелось бы после аггрегации заменить id из первой коллекции другим полем из первой коллекции (полем из документа с этим id)
AstraSerg
...оставляйте нужное или переименовывайте как вам нужно.
M
Прозрение не наступило? :)
Привет. Не :( Сейчас почитал, не наступило. Не понимаю.. У меня группируется по _id: '$user' и $sum считает сумму для всех у кого $id = $user. И как поверх этой группировки получить сумму всех. Совсем не идёт мне..
AstraSerg
Привет. Не :( Сейчас почитал, не наступило. Не понимаю.. У меня группируется по _id: '$user' и $sum считает сумму для всех у кого $id = $user. И как поверх этой группировки получить сумму всех. Совсем не идёт мне..
Добрый день. Вот что накрапал. Не очень красиво, но как стартовый вариант: db.ttt.insertMany([{'type': 'in', 'user': 'aa', 'sid': 'aa1', 'amount': 100}, {'type': 'in', 'user': 'bb', 'sid': 'bb1', 'amount': 200}, {'type': 'in', 'user': 'cc', 'sid': 'cc1', 'amount': 300}, {'type': 'in', 'user': 'aa', 'sid': 'aa1', 'amount': 400}, {'type': 'in', 'user': 'bb', 'sid': 'bb1', 'amount': 500}, {'type': 'in', 'user': 'cc', 'sid': 'cc1', 'amount': 600}, ]) db.ttt.aggregate([ {$match: {'type': 'in'}}, {$group: {_id: null, tot_sum: {$sum: '$amount'}, docs: {$push: "$$ROOT"}}}, {$unwind: '$docs'}, {$group: {_id: '$docs.user', sum: {$sum: '$docs.amount'}, tot_sum: {$first: '$tot_sum'}}}, ]).pretty()
Hopf
Привет, подскажите, есть ли у монги аналог TTL индекса, только который не удаляет запись, а выполняет некое действие? (мне надо навесить метку архива на документ, который не обновлялся час+)
Nick
нет
Hopf
значит, лучше это реализовывать в коде или отказаться от этой затеи. Спасибо
Nick
а зачем вам метка архива, если вы итак уже знаете время и критерий определения архива по нему?
Hopf
хотел утаскивать такие документы в другую коллекцию силами монги.
AstraSerg
хотел утаскивать такие документы в другую коллекцию силами монги.
так и утаскивейте по признаку "старше часа"
Hopf
так и утаскивейте по признаку "старше часа"
да, придется какой-нибудь кронтаб организовывать
AstraSerg
лишние сущности никому не нужны
AstraSerg
да, придется какой-нибудь кронтаб организовывать
не обязательно. Можете писать в 2 коллекции в одной из которой есть удаление по ttl (https://docs.mongodb.com/manual/core/index-ttl/)
AstraSerg
ну вы просили более странное: что бы база _данных_ переносила из одной коллекции в другую по расписанию
AstraSerg
Hopf
Зачем?
Это вопрос в чем задача? Если да, то: Есть набор сервисов, которые пишут о себе. Если сервис отвалился-выключился-ушел на обслуживание, то его надо положить в архив. Возможно потом вытащить
yopp
А зачем в отдельную коллекцию складывать?
Hopf
А зачем в отдельную коллекцию складывать?
Это я просто предположил. Можно действительно, просто при Read учитывать дату изменения
yopp
Если это бизнес-логика, то оставьте документы в коллекции и фильтруйте запросом. Смысла в физическом переносе очень мало
yopp
А проблем будет очень много
Serhii
Всем приввет. Есть колекции User и Room. В Room есть поле users с айдишками юзеров. Как мне сделать агрегацию что бы получить такой ответ { users:[], rooms: [] } и возможно ли это вообще сделать одним запросом?
Nick
возможно, посмотрите на $lookup
Serhii
через $lookup получается что каждому юзеру добавятся комнаты в которых он есть, то есть будет много повторов,
Nick
если я правильно понял нужно поулчить всех юзеров и все комнаты, так?
Serhii
в которых юзеры есть
Nick
фильтрация не столь важна
Serhii
по ходу как то групировать нужно заумно
Serhii
фильтрация не столь важна
фильтрация важна, комнат может продублироваться очень много и лишняя нагрузка на сеть
Nick
вообще тут ничего заумного, вам нужен addtoSet и each
Nick
https://docs.mongodb.com/manual/reference/operator/update/each/
Nick
https://docs.mongodb.com/manual/reference/operator/aggregation/addToSet/
Nick
и группирвока по константе
Serhii
спасибо, буду разбираться)
yopp
а зачем?
yopp
в смысле зачем вам именно в таком виде ответ
Serhii
для поиска
Serhii
нужно найти юзеров по определенным параметрам и комнаты в которых эти юзеры есть
yopp
тогда лучше в два запроса
yopp
сначала найти пользователей, а потом сделать find с $in по их id
Serhii
чето появилась мысля что агрегацией будет быстрее работать, или ошибаюсь?
yopp
у вас проблемы с производительностью?
Serhii
на тестовых данных запрос отрабатывает 70-100 мс
Serhii
чето думаю когда будет много данных будут проблемы
yopp
запрос в rooms или запрос в users?
yopp
убедитесь что в rooms есть индекс по полю в которому лежат id пользователей
yopp
и в users есть индексы по полям по которым вы их фильтруете
Serhii
В юзеров есть
Serhii
А вот в комне на массив юзеров нету
Serhii
Так вообще можно?)
yopp
можно конечно, индексы это опционально
Мечтатель
Подскажите, хорошая ли практика в документе 'пост' хранить список с комментариями к этому посту? Ведь документ ограничен по размеру.
Мечтатель
16 мегабайт вроде