所以我是mongodb的新手,我试图在帖子中插入一个新的评论,其中有一个字段用户(参见id),并返回更新的帖子。问题是如何返回它只有一个查询与populate选项?这是我的代码工作但它的速度很慢,不确定是否因为2'发现'查询。是否有其他方法只使用一个填充查询来执行此操作?
var newComment = {
comment:req.body.text,
isEdit:false,
user:req.body.user
};
comments.create(newComment,function(err,commentCreated){
post.find({_id:req.params.postId},function(err,postFound){
if(err){
throw err;
} else {
postFound[0].comments.push(commentCreated);
post[0].save(function(){
post.find({_id:req.params.videoId}).populate({path:'comments',populate:{path:"user",model:"users"}})
.exec(function(err,data){
if(err){
throw err;
}
else{
res.json(data);
}
})
});
});
答案 0 :(得分:1)
使用 findByAndUpdate()
,它会返回您可以填充的 Query
。在函数上调用exec()
可返回Mongoose Promise,因此您可以将当前代码转换为
var postId = req.params.postId;
var newComment = new Comment({
comment: req.body.text,
isEdit: false,
user: req.body.user
});
newComment.save().then(function(comment){
Post.findByIdAndUpdate(
postId,
{ "$push": { "comments": comment._id } },
{ "new": true, "upsert": true }
)
.populate({
"path": "comments",
"populate": {
"path": "user",
"model": "users"
}
})
.exec();
})
.then(function(data) { res.json(data); })
.catch(function(err) { throw err; });