Я создаю поисковую систему на основе тегов для различных вещей в mongodb.
У меня есть документ блогов, документ с отзывами, документы с комментариями, документ с книгами и документ с изображениями, и все они имеют поле массива тегов.
Теперь, когда я беру книгу, с которой связаны определенные теги, я хотел бы также получить блоги, отзывы и комментарии с этими тегами. Я хотел бы того же, когда я получаю блог ... забираю остальные с тегами, которые есть в блоге. Я разрабатываю свою модель базы данных. как лучше всего справиться с подобным поиском по тегам? в настоящее время я думаю
это лучший способ? как мне спроектировать модель?
Обновлять : Буду искать чаще.

Если вам нужно использовать теги повторить в нескольких коллекциях, я бы предпочел сделать сам коллекция тегов.
Подумайте, если вам нужно изменить имя одного тега в будущем, возможно, из-за ошибки, такой как опечатка, вам нужно будет перебрать все ваши коллекции в поисках этого тега, чтобы исправить это. Разве не было бы проще, если бы вам нужно было заменить только в одном месте?
Встраивание массивов и объектов в один документ - мощный инструмент, но бывают случаи, когда это не лучшее решение. Этот случай - один из них, и вам следует максимально избегать повторений.
Официальная документация говорит о том, чтобы избежать повторений.
Создайте коллекцию тегов и добавьте их ObjectId в массив тегов в других документах вместо самого тега. Как показано ниже.
// tags collection
{
_id: <ObjectId1>
title: "trending"
}
// all other documents (blogs, testimonials...)
{
_id: <ObjectId2>
tags: [
<ObjectId1>
],
// other stuff...
}
Когда вы выбираете один документ, вы можете получить все его теги и искать другие документы со связанными тегами, используя оператор $ в, например:
db.blogs.find({
tags: {
$in: [
<ObjectId1>,
<ObjectIdX>,
// other tags ids
]
}
})
И это вернет сразу все документы, соответствующие одному или нескольким тегам.
Хорошо используемые индексы имеют большое влияние на производительность. Это не место, чтобы рассказывать о том, как они работают, но у mongodb есть multikey indexex, а в вашем конкретном случае - это obviuos, который, теги.
Пример:
db.blogs.createIndex( { "tags": 1 } )
Вы можете ссылаться на свои документы из коллекции тегов. Таким образом, вы можете получить их напрямую, но это добавит лишней информации, сложности и, честно говоря, я не думаю, что вы получите слишком много производительности. Что-то важное, добавьте к тегам в ваших коллекциях многоклавишный указатель.
Это похоже на решение на основе нормализованных данных. Если вам нужны внешние ключи, не лучше ли использовать реляционную модель? Как это связано с масштабируемостью MongoDB?
Добавляя к этому ответу, сохранение тегов в другой коллекции кажется ненужным, можно просто создать перечисление тегов, и если необходимо изменить имя, ну ... просто измените его, это перечисление с числовым представлением.
Спасибо, меня больше всего беспокоит добавление тега к каждому, а затем поиск в других документах? поиск будет трудным, правда? а что в этом случае проще добавлять и обновлять конкретный документ? но мне нужно будет часто искать. ? ..то, что должно быть сделано