Mongodb用populate返回更新的对象

时间:2017-02-03 05:31:43

标签: node.js mongodb express mongoose

所以我是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);
                        }
                  })

               });

           });

1 个答案:

答案 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; });