Mongodb用populate返回更新的对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mongodb用populate返回更新的对象相关的知识,希望对你有一定的参考价值。

所以我是mongodb的新手,我正在尝试插入一个新的评论,其中有一个字段用户(由id引用)到一个帖子并返回更新的帖子。问题是如何只返回一个查询与填充选项?这是我的代码工作,但它的速度很慢,不确定它是否因为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);
                        }
                  })

               });

           });
答案

使用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; });

以上是关于Mongodb用populate返回更新的对象的主要内容,如果未能解决你的问题,请参考以下文章

19-3-18 mongoose 连表查询populate用法

MongoDB - 仅获取已填充文档的数组中的第一项 - 例如user.populate('posts', 'images.0')

找不到 id 并更新和增加子文档 - 返回 null Mongoose/mongoDB

MongoDB 中的关联查询MongoDB : aggregate/lookup 对比 Mongoose : ref / populate

Spring Mongo Populator 一一

Model.populate() 是不是返回一个承诺?