mongodb - 一次链接许多文档

时间:2012-07-19 04:10:03

标签: javascript mongodb

我正在为帖子提供JSON API,我希望在将post对象链接到相应的用户模型后传递它。

我有一个像这样的MongoDB架构:

User = {
    email: String,
    password: String
};

Post = {
    user: ObjectId,
    text: String
};

我没有发现链接单个帖子的问题,我使用以下代码完成了(我使用的是Mongoose和Express):

app.get('/api/posts/:id', function(req, res){
  return Post.findById(req.params.id, function(err, post) {
    if (!err) {
        User.findById(post.user, function(err, user){

            var joinedpost = {
                text : post.text,
                user : user
            };
          return res.send(joinedpost);      
        });
     }
  });
});

然而,当我想要服务多个帖子时,我面临以下问题:由于我在异步环境中工作,我不能简单地获取所有帖子并迭代它们以将每个帖子链接到其用户。

所以我认为我应该写两个查询,一个提取帖子,另一个连接它们,这样我就可以立即为它们服务。我对么?如果是这样,我怎么能实现呢?

1 个答案:

答案 0 :(得分:1)

$in运算符允许您在一个查询中执行此操作。这是我如何做到的(假设你使用下划线):

app.get('/api/posts', function(req, res){
  return Post.find(function(err, posts) {
    if (!err) {
      var userIds = _.pluck(posts, user);
      User.find({"id": {"$in": userIds}}, function(err, users){
        var map = {};
        _.each(users, function(u){
          map[u.id] = u;
        });
        _.each(posts, function(p){
          p.user = map[p.user];
        });
        return res.send(posts);
      });
    });
   }
});

这未经过充分测试,您需要在User.find电话上处理错误情况,但它应该是一个很好的起点。

此外,async库对此类内容有很大帮助。你可以研究一下像waterfall这样的方法来解决疯狂的嵌套回调问题。