Модель маркировки мангуст - PullRequest
       6

Модель маркировки мангуст

0 голосов
/ 31 октября 2018

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

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

То, что я получил до сих пор, это следующие модели

const PostSchema = new Schema({
  post: String,
  tags: [{
    type: Schema.Types.ObjectId,
    ref: 'Tag'
  }],
  updated: {
    type: Date,
    default: Date.now
  }
});

const TagSchema = new Schema({
  name: {
    type: String,
    unique: true,
    required: true
  },
  updated: {
    type: Date,
    default: Date.now
  }
});

Вопрос 1 : Подойдет ли это для моего варианта использования?

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

В настоящее время в моем сообщении используется следующая логика # create endpoint

Post.create(req.body, (err, text) => {
  if (err) {
    res.send({ 'error': 'An error has occurred' });
  } else {
    const newTags = req.body.tags.filter(tag => tag._id === undefined && tag.name);
    Tag.init().then(() => {
      Tag.create(newTags.map(tag => tag.name), (err, tags) => {
        tags.forEach(tag => { text.tags.push(tag) });
        text.save();
      })
    });
    res.send(text);
  }
});

Тело запроса на этой конечной точке может выглядеть примерно так:

{
  "post": "Post message",
  "tags": [
    { "_id": "1234" }, // Existing tag
    { "name": "my tag" } // New tag
  ]
}

Вопрос 2 : Есть ли какой-нибудь лучший / более простой способ добиться этого, чем приведенный выше код?

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