0

我正在为帖子提供 JSON API,我想在将帖子对象链接到适当的用户模型后传递它。

我有一个这样的 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);      
        });
     }
  });
});

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

所以我想我应该写两个查询,一个获取帖子,另一个同时链接它们,这样我就可以立即为它们提供服务。我对么?如果是这样,我怎样才能做到这一点?

4

1 回答 1

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方法来解决疯狂的嵌套回调问题。

于 2012-07-19T05:15:00.367 回答