Sergey
Эти данные элементарно могут разъехаться, если второй запрос не выполнится
Anonymous
так разве неделают ? как считать сколько у автора постов всего ?
Sergey
Количество постов хранить гораздо проще цифрой. Массив ради количества хранить как-то странно
Anonymous
Эти данные элементарно могут разъехаться, если второй запрос не выполнится
но точно также если я буду увеличивать счетчик постов у автора, и возникнит ошибка, данные также разъедутся
Sergey
но точно также если я буду увеличивать счетчик постов у автора, и возникнит ошибка, данные также разъедутся
Можно пересчитывать на каждую вставку нового поста или в фоне. Если счётчик уедет на 1-2 значения, никто не умрёт - это просто кеш для ускорения доступа к числу постов. А вот неконсистентные связи могут много крови попортить.
Sergey
Тем более, что достать число и посчитать длину массива - это немного разные по стоимости операции.
Anonymous
Тем более, что достать число и посчитать длину массива - это немного разные по стоимости операции.
может глупость напишу, но я использовал aggregate() и использовал этот массив чтобы создать поле posts_count и другие счетчики ....да там есть еще два массива для лайков , подписчиков и тд )) значит это все не правильно ? блин
Anonymous
или вот как мне узнать список постов какие лайкнул пользователь не создавая у него массив с id шниками постов ?
Sergey
Все зависит от того как данные будут потом использоваться. Показать список пользователей с количеством их постов - довольно частый кейс. Показать список пользователей со списком постов, которые они полайкали... С учётом того, что лаков могут быть сотни, это вряд ли понадобится
Anonymous
для этого можно популировать или не популировать данные постов, а чтобы не возвращать массив когда не надо я и хотел использовать aggregate(). в общем придется думать. над этим
Sergey
Aggregate медленный. Aggregate с lookup - ещё медленнее.
Sergey
Лучше хранить данные в таком виде, в котором их потом будет удобно доставать
Anonymous
Но основная проблема так и не решена. При сохранение поста мне придет искать автора отдельно, если я не могу пропопулировать его данные в пост. потому что пост должен содержать в себе данные автора.
Sergey
Если, конечно, соотношение записи к чтению не в пользу записи. Но так редко бывает.
Sergey
Ну вообще, findOneAndUpdate возвращает документ Я не знаю что такое findById..., это явно что-то из обвязки фреймворка
Anonymous
когда я получаю список постов я популирую в них через монгу данные автора, и на клиенте в катрочке поста я могу отобразить данные автора. При добавлении нового поста мне надо получить такой же пост. Единственный тупой выход, который мне приходит в голову, это после сохранения поста найти в базе только что созданный пост и пропропулировать туда данные автора и вернуть это клиенту ))))) Но ведь это не правельно
λ
Что-то голова не соображает. Как написать аналогично вот такому SQL SELECT message.*, user.* FROM message, user WHERE message.author_id = user.user_id AND (user.user_id = ? OR user.user_id IN (SELECT whom_id FROM follower WHERE who_id = ?)) ORDER BY message.pub_date DESC LIMIT ?
λ
Картинкой
Denis
никак
Denis
есть $lookup
Denis
в его сторону смотри
Denis
но вообще если нужно делать такие вещи в NoSQL, значит данные структурированы неправильно
λ
Ах. То-то я думаю голова взрывается от попытки сообразить.
λ
noSQL все больше и больше нравится, но пока стоооолько времени потратил на все это…
λ
Кажется простая задача. Получить "message" с добавленным в него полем email из колекции users где message.author_id == user._id
λ
Ой. Я всего местами localField и foreignField перепутал 🙃
λ
Такие вещи это какие?
Я думаю он про связывающую таблицу follower. Которая many to many
ikasymov
Я еще новичок в mongodb но если я хочу вытащить скажем пользователя и его посты надо два запроса делать?
λ
Во. Я как раз этим занимаюсь)
λ
У меня 2 колекции: 'messages': в которой 'author_id' "ссылается" на документ из 'users' колекции.
λ
Пока не получается, не могу понять почему. Либо все users вынимаются и ложатся в каждый документ messages либо пусто
λ
messages = mongo.db.messages.aggregate([ { '$lookup': { 'from': 'users', 'localField': 'author_id', 'foreignField': '_id', 'as': "email" } } ])
ikasymov
курсы чтоли проходите?
делаю проект и структуру сделал как в реляционных бд и тут наткнулся на этот пост
Denis
ну вот самый простой пример из доки как в монге решаются такие проблемы
Denis
https://docs.mongodb.com/manual/tutorial/model-embedded-one-to-many-relationships-between-documents/
Denis
https://docs.mongodb.com/manual/applications/data-models/
Denis
https://www.mongodb.com/blog/post/thinking-documents-part-1?jmp=docs&_ga=2.155086200.1944121697.1511842606-657691548.1462567944
λ
Мне не удобно изменять структуру больше. Если переместить message в user, то в будущем когда мне нужно будет вывести все сообщения от пользователей с которыми я дуржу разве не будет еще ужасней?
Denis
в таком случае действительно лучше сделать 2 коллекции, хранить референсы на всех твоих друзей
λ
Ну я вот сделал 2 колекции. Соощения отдельно. Пользователи отдельно. У пользователя есть масив "друзья" с id-шками на других пользователей
λ
Думаю потом брать этот масив и искать по сообщениям
Denis
да, так будет проще
Denis
Кажется простая задача. Получить "message" с добавленным в него полем email из колекции users где message.author_id == user._id
а вот это лучше не делать, если тебе нужен email то денормализовать скорее всего выгоднее
Denis
$lookup медленный
λ
Эм. А как тогда сделать. Всеравно же прийдеся запрашивать с пользователя емейл
λ
Блин. На первом же запросе застрял. А обещал что за день все SQL-> noSQL >_<
λ
Я понял чего не работает. Я то сверяю по _id, а он в первой колекции как String
Denis
Эм. А как тогда сделать. Всеравно же прийдеся запрашивать с пользователя емейл
ну у тебя сообщения как приходят в приложение? денормализовать в том плане чтобы продублировать email поле в messages коллекции при вставке, а не из users его джоинить, если это часто требуется
λ
А если user сменить свой email?
λ
Пробегать по всем messages? Ьам тх мнооого будет(
Denis
да, не очень но мне сложно что-то сказать, я даже не знаю что за приложение и как оно должно себя вести
Denis
монга лучше всего подходит когда данные можно представить в виде дерева
Sergey
делаю проект и структуру сделал как в реляционных бд и тут наткнулся на этот пост
Тут главная ошибка - если данные реляционные и их структура реляционная, то лучше использовать реляционную базу иначе будет много боли.
Sergey
aggregate, lookup 😭
Sergey
Когда в базе будет несколько сотен тысяч сообщений - этот запрос умрёт
λ
А что делать? 😞
Sergey
Ну во-первых выносить sort и limit в самое начало pipeline
λ
Разумно! Согласен!
λ
Если лимит будет мелким, то lookup же тогда не страшен?
Sergey
Конкретно в этом случае - скорее всего два простых запроса будут легче и быстрее, чем aggregation.
Sergey
Проблемы начинаются когда надо достать сразу N постов у N пользователей
λ
Это же еще не все)
λ
Там в match еще предстоит добавить $or: [{...}, {$in: }]
λ
λ
Запрос уже в экране не умещается)
Alex
Зато sql учить не надо :)
Stepan
Зато sql учить не надо :)
Монга конечно прекрасна :) Но лучше уж sql чем aggregate :)
λ
aggregate на самом деле норм, но не в моем случае)
λ
Когда не умеешь готовить данные в noSQL — https://bpaste.net/show/232d411da8c5
λ
А можно вот эти $project обединить? {'$project': {'author.pw_hash': 0}}, {'$project': { 'author': { '$arrayElemAt': ['$author', 0] }, 'text': 1, 'pub_date': 1 }}
Nick
А ты пробовал их объединить?
Arthur
А возможно ли модифицировать документ в capped collection ?
Nick
у меня ответ на этот вопрос занял примерно время на окрытие гугла и ввода запроса
Nick
что тебе помешало также сделать?
Arthur
в гугл информация возможно устарела