我正在为教学目的创建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('/');
});
});
我错过了什么?
答案 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')
获取代码名称。