架构的Mongoose数组不会在id旁边保存任何内容

时间:2018-03-14 10:05:54

标签: node.js mongodb mongoose

我正在为教学目的创建blog。我想要标签(可选)。问题是它正在创建新的TagSchema,但它只在相关帖子的数据库中保存_id,而不是标签的名称。

PostSchema

var mongoose = require('mongoose'),
Comment = require('./Comment'),
Tags = require('./Tag');

var PostSchema = new mongoose.Schema({
  Author: String,
  Title: String,
  Description: String,
  Comments: [{
    type: mongoose.Schema.Types.ObjectId, ref: 'Comment'   
  }],
  Tags: [{
    type: mongoose.Schema.Types.ObjectId, ref: 'Tag'
  }],
  CreatedOn: Date,
  LastEditOn: Date
});

mongoose.model('Post', PostSchema);

module.exports = mongoose.model('Post');

TagSchema

var mongoose = require('mongoose');

var TagSchema = new mongoose.Schema({
  TagName: String
});

module.exports = mongoose.model('Tag', TagSchema);

并在post请求中

app.post('/post-add', isLogged, (req, res) => {
    // save new post
    var post = new Post();

    post.Author = req.user.username;
    post.Description = req.body.Description;
    post.Title = req.body.Title;
    post.CreatedOn = new Date();

    if (req.body.Tag.length > 0) {
        var tags = req.body.Tag.split(' ');

        tags.forEach((element, idx) => {    
            var tag = new Tag();
            tag.TagName = element;

            post.Tags.push(tag);
        });
    }

    post.save((err) => {
        if (err) return err;

        res.redirect('/');
    });
});

我错过了什么?

1 个答案:

答案 0 :(得分:1)

有多种方法可以做,取决于你真正想要的东西。

如果您不需要为_id生成Tag,则可以将标记模型设置为:

var mongoose = require('mongoose');

var TagSchema = new mongoose.Schema({
  _id: String
});

module.exports = mongoose.model('Tag', TagSchema);

这可以避免创建重复的标签。

如果您仍然需要一个唯一的_id,那么您需要先创建代码并保存:

var tag = new Tag();
tag.TagName = element;
await tag.save();

我会将.findOneAndUpdate().upsert()一起使用,而不是在这种情况下始终创建new Tag()。 然后,当您获得Post时,请使用.populate('Tags')获取代码名称。