使用Mongoose将数组('tags')保存到MongoDB

时间:2015-01-08 23:20:06

标签: javascript node.js mongodb mongoose

我和Mongoose一起玩,我在保存到阵列时遇到了麻烦。例如,我在页面上有一个输入字段,用于逗号分隔的标记。我从req.body.tags中获取这些内容,删除空格,然后用逗号分隔它们以获取标记数组。现在,如何将此数组保存回我的数据库?我猜测我已经错误地设置了这部分架构但是我不确定什么是对的,说实话。我到目前为止的架构是:

var postSchema = mongoose.Schema({
  title: String,
  permalink: String,
  content: String,
  author: {
    id: String,
    name: String,
  },
  postDate: {
    type: Date,
    default: Date.now
  },
});

如果我要保存标签(例如,从帖子中),最好是有一个名为tags的数组,然后每个标签都有一个名称(和id?)?如果是这样,我会在架构中添加如下(如下)的内容吗?向帖子添加标签的想法是我可以在帖子上显示它们(作为链接),并且能够在数据库中搜索具有特定标签的所有帖子。这是正确的方法吗?

tags: [{
  name: String,
  id: String
}]

发布到新帖子路线时,我执行以下操作:

  post = new Post(req.body);
  tags = req.body.tags.replace(/\s/g,'').split(',');
  // maybe post.tags = tags ?    
  post.save(function(err) {
    if (!err) {
      res.redirect('/posts');
    } else {
      ...
    }
  });

这成功保存了提交的所有其他字段(标题,作者,内容等),但我不确定如何将新创建的标记保存回数据库。这里的任何建议都会非常受欢迎,因为我是新手,并且热衷于继续学习。谢谢!

1 个答案:

答案 0 :(得分:4)

如果你真的想要你的"标签"数组有一个名称字段和一个生成的_id字段然后定义另一个模式并嵌入它:

var tagSchema = mongoose.Schema({
    name: String
});

var postSchema = mongoose.Schema({
  title: String,
  permalink: String,
  content: String,
  author: {
    id: String,
    name: String,
  },
  postDate: {
    type: Date,
    default: Date.now
  },
  tags: [tagSchema]
});

然后在创建Post对象之前将输入操作到正确的结构:

req.body.tags = req.body.tags.replace(/\s/''/g).split(",").map(function(tag) {
    return { "name": tag };
});

var post = new Post(req.body);

或者只是将其保留为普通字符串数组:

var postSchema = mongoose.Schema({
  title: String,
  permalink: String,
  content: String,
  author: {
    id: String,
    name: String,
  },
  postDate: {
    type: Date,
    default: Date.now
  },
  tags: [String]
});

并且不用担心映射对象属性:

req.body.tags = req.body.tags.replace(/\s/''/g).split(",");
var post = new Post(req.body);