最近闲着,拿出上个月写的代码,随便改进了一下未完评论的路由接口。评论应该是整个博客数据存储中模型最复杂的部分。首先要考虑的是与文章的关联。这个可以和mongoDB的ref关联起来,然后populate可以用来计算关联的字段。最后一个复杂的关系是父子级评论,或者说多级评论。这时候就需要思考如何做才能合理地管理这些层级关系。删除父评论时,可将所有子评论一并删除。查询时,如何输出从根到叶顺序的层次关系。创建评论模型constschema=newmongoose.Schema({//评论idcid:{type:Number,required:true,unique:true},//postidpid:{type:Number,required:true},post:{type:mongoose.SchemaTypes.ObjectId,ref:'Post'},content:{type:String,required:true},createTime:{type:Number,default:Date.now()},author:{类型:字符串,必需:真},所有者:{类型:字符串,必需:真},isOwner:{类型:布尔值,必需:真},电子邮件:{类型:字符串},网址:{类型:字符串},键:{type:String,required:true,unique:true},parent:{type:mongoose.SchemaTypes.ObjectId,ref:'Comment'},hasChild:{type:Boolean,default:false},ipAddress:{type:String,required:true},userAgent:{type:String},//0Review1Post2Garbagestate:{type:Number,required:true,default:0}})在模型中,post列与引用关联table(posttable)_id(article),在hasChild记录是否有回复。稍后处理回复路由时不要忘记修改它的值。最关键的是key列,用来记录并行级别。比如帖子里一篇pid为11的文章下面有评论,那么key命名为11#001,就是第一条评论,如果这条评论下面有回复,那么回复的key就是11#001#001,下层同理。使用此命名方式每条评论可容纳的回复数为999,0的个数可根据需要调整。设置Key的意思是在创建记录的时候直接生成后期需要用到的slug,方便前端调用。这是一个原因。当然,这不是重点。通过分层命名的键,删除父评论非常方便。例如下图所示的关系层级。然后删除key为11#001的评论,只用正则匹配/^11#001/,删除所有匹配的内容,不管关联的post是否一致,cid,和的值key可以从前端发起request中提取cid,用cid去查这条唯一记录,从中得到我们需要的key。参考删除注释路由如下router.delete('/',async(req,res)=>{constid=req.query.idif(id){constisCid=id.length!==24?true:falsetry{constquery=awaitComment.findOneAndDelete({cid:id}).populate('post')if(query){if(query.hasChild){constdelCount=(awaitComment.deleteMany({key:newRegExp(`^${query.key}`,'ig')})).deletedCount+1}awaitUser.updateOne({username:req.username},{$inc:{'options.comments_nums':-(delCount||1)}})//删除帖子的评论数query.post.comments-=delCount||1awaitquery.post.save()}returnres.send({ok:1,n:1、deleteCount:delCount||1})}catch(e){console.log(e)returnres.send({ok:0,msg:'参数不正确'})}}returnres.send({ok:0,msg:'请输入正确的ID'})})删除完成后,创建新评论就容易多了,只需根据原来的评论数设置一个新的key即可。您可以使用模型提供的方法countDocument()。constbody=req.bodyconstcomments=awaitComment.countDocuments({pid,key:newRegExp(`^${pid}#\\d\\d\\d$`)})body.key=String(pid)+`#${String(comments+1).padStart(3,0)}`最后,查看数据库中的记录。接口测试初学者,一起学习,不足之处欢迎指出。转载自我的博客博客评论的合理建模--MongoDB
