猫鼬标记模型

时间:2018-10-31 09:56:12

标签: node.js mongodb express mongoose tags

我正在尝试为我的新项目建模结构。我来自关系数据库背景,我试图了解如何最好地建立关系模型,例如,帖子中可以包含多个标签。我的用例如下:

  • 用户可以创建/编辑帖子
  • 创建/编辑帖子时,用户可以搜索现有标签或添加新标签
  • 用户在查看帖子时可以看到每个相关标签
  • 用户在查看标签时可以看到每个相关的帖子

到目前为止,我得到的是以下型号

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 :这对我的用例来说是一个很好的设置吗?

我看到的优点是,我可以使用标签模型轻松搜索新闻标签,并且每个标签都是唯一的。我一直遇到的问题是,当用户创建/更新帖子时,我不确定如何处理请求。

当前,我在post#create端点中具有以下逻辑

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 :是否有比上述代码更好/更轻松的方法来实现这一目标?

0 个答案:

没有答案