嗨,我没有从存储另一个DBS的id的DB对象中获取数据,实际上,这是一个博客网站,所以我正在发布评论和行为评论,但有问题我在所有帖子上得到相同的评论,但我想,每个帖子都应该有自己的评论。这是post schema
const blogSchema = new mongoose.Schema({
title: String ,
content: String,
image:{data: Buffer,contentType: String},
comment:[
{
type:mongoose.Schema.Types.ObjectId, ref:'Comment'
}
]
});
下面是注释模式
var commentSchema = new mongoose.Schema({
name:{
type:String,
required: "this field is required"
},
comment:{
type:String,
required:"this filed is required"
},
blog:{
type:mongoose.Schema.Types.ObjectId,
ref: 'Blog'
}
},{
timestamps: true
})
node js router接收post但不接收comment
pp.get("/post/:postname",(req,res)=>{
// const requesttitle = _.lowerCase(req.params.postname);
const requesttitle = req.params.postname;
Blog.findOne({_id: requesttitle} ,(err ,got)=>{
if(err){
console.log(err)
}else{
const data= got.comment.find({})
console.log(data)
res.render('post',{post:got });
}
})
})
我认为问题出在你的Schema上。在blogSchema
中,您可以参考许多Comment
文档,而在commentSchema
中,您可以参考单个"博客"。(我建议不要把它命名为"blog";但"post"因为它就是这样的)。这种重复引用在大多数情况下是不必要的。
因为在你的设置一个单独的评论只能是一个特定的帖子的子,这将是我要去的参考。post文档本身并不需要直接知道包含了哪些评论,因为这些信息已经保存在Comment文档中了。
For yourpost我建议使用以下模式:
// Post Schema
const postSchema = new mongoose.Schema({
title: String ,
content: String,
image: { data: Buffer, contentType: String }
});
为您的评论我建议使用以下模式:
// Comment Schema
const commentSchema = new mongoose.Schema({
name: {
type: String,
required: "this field is required"
},
comment: {
type: String,
required: "this filed is required"
},
post: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Post'
}
});
现在确定下一步取决于整个前端部分的设置,但是拥有这样的模式将允许您按照以下行执行:
pp.get("/post/:id", async (req,res) => {
const id = req.params.id;
const post = await Post.findOne({ _id: id });
const comments = await Comment.find({ post: id });
res.render('post', {
post: post,
comments: comments
});
});
优点
- 单向关系意味着创建或删除评论的工作量更少。
- 在一个api调用中获得评论和/或帖子或两者的可能性。
- 如果post和comments都被请求,需要2个数据库调用
选择:子文档
作为使用引用文档的替代方法,您可以使用子文档.
对于您的commentSchema
,这意味着您不需要从中创建一个单独的模型。然而,你的postSchema
需要看起来像这样:
const commentSchema = new mongoose.Schema({
message : { type : String }
});
const postSchema = new mongoose.Schema({
comments : [commentSchema]
});
👆默认情况下,如果您从数据库中检索该帖子,则包含该帖子的所有评论。然而,它也需要一个不同的代码来与这些注释进行交互(添加,删除,…),但我相信你可以在文档中阅读到它。