Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript mongodb-一次链接多个文档_Javascript_Mongodb - Fatal编程技术网

Javascript mongodb-一次链接多个文档

Javascript mongodb-一次链接多个文档,javascript,mongodb,Javascript,Mongodb,我正在为post提供一个JSON API,我希望在将post对象链接到适当的用户模型之后交付它 我有这样一个MongoDB模式: User = { email: String, password: String }; Post = { user: ObjectId, text: String }; 我发现链接一篇文章没有问题,我使用了以下代码(我使用的是Mongoose和Express): 然而,当我想为多篇文章提供服务器时,我会面临以下问题:因为我在一个异步

我正在为post提供一个JSON API,我希望在将post对象链接到适当的用户模型之后交付它

我有这样一个MongoDB模式:

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

Post = {
    user: ObjectId,
    text: String
};
我发现链接一篇文章没有问题,我使用了以下代码(我使用的是Mongoose和Express):

然而,当我想为多篇文章提供服务器时,我会面临以下问题:因为我在一个异步环境中工作,所以我不能简单地获取所有文章并对它们进行迭代以将每个文章链接到它的用户


因此,我认为我应该编写两个查询,一个用于获取帖子,另一个用于同时链接所有帖子,这样我就可以立即为它们提供服务。我说得对吗?如果是这样,我该如何实现这一点呢?

中的
$in
操作符将允许您在一个查询中完成此操作。下面是我的做法(假设您使用下划线):

这没有经过很好的测试,您需要处理
User.find
调用上的错误条件,但这应该是一个很好的起点


另外,
async
库对这样的东西帮助很大。您可能会研究它,以及类似于
瀑布式
的方法来绕过疯狂的嵌套回调问题。

非常感谢您,这正是我想要的:)当我有一个简单的案例时,您提到的方法工作得很好。然而,当我有一个有几个评论的帖子模型,每个评论都有一个用户时,事情就变得复杂了。(你可以看看这里)。人们通常这样使用MongoDB吗?是的,人们经常这样做。基本上,这只是应用程序端的连接。Node使事情变得更复杂,因为它有大量回调,这就是为什么异步库派上用场的原因。再次感谢。我现在很高兴知道我不是一个写代码的疯子:D
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);      
        });
     }
  });
});
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);
      });
    });
   }
});