同步查询以填充对象

时间:2018-06-26 10:05:10

标签: mongodb asynchronous restify

我有一个使用Restify,Node.js和MongoDB的项目。这是一个用于测试Restify的小项目,我在那里有一些文章,并对它们有一些评论。

我实际上是在尝试创建一条采用文章标题并返回所有具有相同名称的文章(某些文章具有完全相同的名称)并将其与评论关联的路线。

所以在全球范围内,我已经做到了:

server.get('/articles/title/:title', (req, res, next) => {
    Article.find({'title': req.params.title}, (err,articles) => {
        if(err) {
            return next(new errors.InvalidContentError(err.errors.name.message));
        }
        for(var i=0;i<articles.length;i++) {
            Comment.find({'article': articles[i]._id}, (err, comments) => {
                articles[i]["link"] = comments;
            });
        }
        res.send(articles);
        next();
    });
});

但是此代码无效,因为Comment.find是异步的。

所以我的问题是,如何使此代码同步?我查看了文档,但是找不到真正可以帮助我的东西。我什至不确定我的思维方式是否是实现这一目标的好方法。

2 个答案:

答案 0 :(得分:1)

您的操作方式有误,如果您使用的是“猫鼬”库,则可以使用populate()方法发表评论并一起发表, take a look this mongoose documentation

如果您正在执行原始mongo查询,则需要使用$lookup聚合 $look up documenation

您可以通过上述方法高效地将您匹配的帖子和评论全部提取

答案 1 :(得分:0)

db.yourparent_table.aggregate([
// to split each of array element
{ "$unwind": "$your_children_field" },

{ "$lookup": {
   "from": "yourparent_table",
   "localField": "your_children_field",
   "foreignField": "_id",
   "as": "comments"
}},

])