【问题标题】:mongodb - Linking many documents at oncemongodb - 一次链接多个文档
【发布时间】:2012-07-19 04:10:02
【问题描述】:

我正在为帖子提供 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);      
        });
     }
  });
});

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

所以我认为我应该编写两个查询,一个获取帖子,另一个同时链接它们,以便我可以立即为它们提供服务。我对么?如果是这样,我该如何实现?

【问题讨论】:

    标签: javascript mongodb


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

    【讨论】:

    • 非常感谢,这正是我想要的 :)
    • 当我有一个简单的案例时,您提到的方式效果很好。但是,当我有一个包含多个 cmets 的帖子模型并且每个评论都有一个用户时,事情真的变得复杂了。 (您可以在这里查看github.com/wikitechie/microcommunity/blob/master/app.js#L268)。人们通常这样使用MongoDB吗?
    • 是的,人们经常这样做。基本上,这只是应用程序端的连接。 Node 让事情变得更加复杂,因为它有大量的回调,这就是异步库派上用场的原因。
    • 哦,再次感谢您。我现在很高兴知道我不是一个疯狂的人来编写那个代码:D
    猜你喜欢
    • 1970-01-01
    • 2019-01-23
    • 2021-01-15
    • 2019-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 1970-01-01
    相关资源
    最近更新 更多