Как видно из названия, у вас есть коллекция сообщений.Пост имеет идентификатор пользователя (автора).Другой пользователь может поделиться сообщением.Сообщения также имеют теги, массив идентификаторов тегов, к которым они относятся.Как сохранить это для быстрого поиска?
Вариант использования: у вас есть подключения.Вы видите сообщения из ваших подключений или сообщения, опубликованные вашими подключениями.Посты имеют «скорость», по которой они упорядочены на странице.Общий пост может либо наследовать и сохранять скорость оригинала, либо жить, либо умирать собственной скоростью.Не уверен, что лучше.
Опции, которые я рассмотрел:
Post {id :uniquePostId, userId: authorId, shares: [userIds of those who shared], tagIds: [tagIds for post]}
Проблема с этим методом: Mongo не позволяет индексировать два массива.Таким образом, запрос медленный, как ад, если вы хотите делать запросы как по tagIds, так и по общим ресурсам.Индексирование обоих по отдельности приводит к почти полному сканированию таблицы.
Другой вариант:
Вы дублируете сообщение следующим образом:
Post {id: uniquePostId, userId: user who authored or shared the post, original: {postId: the original postId, or null if this is it, userId: the author of the original post}}
Проблемы с этим подходом: скажем, вы хотитечтобы получить 20 сообщений, вы запрашиваете идентификатор пользователя в своих соединениях. Как вы справляетесь с дублирующимися ресурсами в своих соединениях?Становится некрасиво.
Другие подходы, которые я читал:
post: {
shares_and_tags: [{type: share, id: 1}, {type: tag, id:4}, ...]
}
Кажется, это решает проблемы с индексацией, но я не знаю достаточно о Mongo, чтобы понять последствия для производительности здесь,Вскоре проведу тестирование, но подумал, что я посмотрю, есть ли у сообщества какие-либо советы или опыт.Спасибо!