Кейс примерно следующий:
1. Есть n пользователей, каждый может размещать документы
2. К каждому посту пользователь может добавлять теги
3. Пользователи между собой не пересекаются, работают каждый со своими документами
Документ (без лишних полей):
{
userId: ObjectId('...'),
tags: ['foo', 'bar', 'baz']
}
4. Пользователь заходит на страницу со списком своих документов. Допустим выводятся первые 10, а у него их 100, есть пагинатор.
5. На этой же страницы выводится облако тегов со всеми тегами (или фильтр постов по тегам), без дублей. То есть, если бы у нас было два документа, один с тегами 'foo' и 'bar', второй - с тегами 'bar' и 'baz', то вывелось бы 'foo, bar, baz'.
Какие я вижу варианты:
1. Можно доставать из базы все документы, собирать массив тегов и выкидывать из него дубли. Возможно стоит кэшировать результат такой выборки (куда?).
2. Можно не сохранять теги в документ, а хранить их в отдельной коллекции
{
userId: ObjectId('...'),
tags: [ObjectId('...'), ObjectId('...')]
}
Но это ведь уже MySQL получится.
Как решить такую задачу правильно?