Модель поиска на основе тегов в Mongodb

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

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

  • добавить теги в каждый документ
  • при извлечении возьмите тег и выполните поиск по всем остальным документам
  • взять результат, а затем отправить с результатом

это лучший способ? как мне спроектировать модель?

Обновлять : Буду искать чаще.

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
4
0
3 083
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вам нужно использовать теги повторить в нескольких коллекциях, я бы предпочел сделать сам коллекция тегов.

Зачем мне перемещать теги в их собственную коллекцию?

Подумайте, если вам нужно изменить имя одного тега в будущем, возможно, из-за ошибки, такой как опечатка, вам нужно будет перебрать все ваши коллекции в поисках этого тега, чтобы исправить это. Разве не было бы проще, если бы вам нужно было заменить только в одном месте?

Встраивание массивов и объектов в один документ - мощный инструмент, но бывают случаи, когда это не лучшее решение. Этот случай - один из них, и вам следует максимально избегать повторений.

Официальная документация говорит о том, чтобы избежать повторений.

Структура коллекции

Создайте коллекцию тегов и добавьте их 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
    ]
  } 
})

И это вернет сразу все документы, соответствующие одному или нескольким тегам.

Подробнее об операторе $ in.

Другие советы

Хорошо используемые индексы имеют большое влияние на производительность. Это не место, чтобы рассказывать о том, как они работают, но у mongodb есть multikey indexex, а в вашем конкретном случае - это obviuos, который, теги.

Пример:

db.blogs.createIndex( { "tags": 1 } )

Спасибо, меня больше всего беспокоит добавление тега к каждому, а затем поиск в других документах? поиск будет трудным, правда? а что в этом случае проще добавлять и обновлять конкретный документ? но мне нужно будет часто искать. ? ..то, что должно быть сделано

Circle 20.04.2018 05:02

Вы можете ссылаться на свои документы из коллекции тегов. Таким образом, вы можете получить их напрямую, но это добавит лишней информации, сложности и, честно говоря, я не думаю, что вы получите слишком много производительности. Что-то важное, добавьте к тегам в ваших коллекциях многоклавишный указатель.

Ivan Beldad 20.04.2018 05:57

Это похоже на решение на основе нормализованных данных. Если вам нужны внешние ключи, не лучше ли использовать реляционную модель? Как это связано с масштабируемостью MongoDB?

Kaan C. Fidan 14.10.2019 13:55

Добавляя к этому ответу, сохранение тегов в другой коллекции кажется ненужным, можно просто создать перечисление тегов, и если необходимо изменить имя, ну ... просто измените его, это перечисление с числовым представлением.

naor.z 30.05.2020 10:48

Другие вопросы по теме