【问题标题】:Nested query Synchronization in mongodbmongodb中的嵌套查询同步
【发布时间】:2017-08-06 19:54:19
【问题描述】:

我有以下两个收藏:

1) Users: {name: xyz,
         email:abc@xuz.com}
2) Posts: {_id: 12345678,
        time:asdfg,
        authEmail:abc@xyz.com,
        description: asdigligvilud}

在这里,我想获取每个帖子的详细信息以及相应的作者 ID 名称。 所以我写了这样的查询:

// get all the posts
Posts.find((err, posts)=> {

  if (err) { next(err) };
  var data = Array();
  var count = 0;
  var len = posts.length;
  // function to check the end of inner queries
  var checkloop = function(){
    count++;
    if(count===len)
        return res.json({result:data,
                msg:'success'});
    }

  for(var i=0;i<len;i++){

    Users.findOne({email:posts[count].authEmail},(err,usr)=>{

    if(usr){
        var item = {
                    'authorName':usr.name?
                    'email':usr.email,
                    'postDesc':posts[count].desc,
                    'creationTime':posts[count].time
                    }
        data.push(item);

        }
        checkloop();
    });

    }

});

但是对于每个迭代,我得到相同的结果,即 post deatils 和 author id 对应于第一个循环,即仅是 posts[0]。 所以我认为这是因为查询的异步性质。是否有任何标准方法可以在 mongodb 中进行此类查询,或者我是否需要更改我的回调方法?

提前致谢。

【问题讨论】:

  • 使用$in 而非循环进行one 查询。 Users.find({ 'emai'l: { '$in': posts.map(p =&gt; p.authEmail) } },(err,users) =&gt; { ...。无需循环异步调用,也没有混乱。

标签: node.js mongodb synchronization mongodb-query mongoose-schema


【解决方案1】:

我相信您遇到的问题是因为 for 循环内的 count 可能是 i。此外,每个循环迭代在Users.findOne回调中捕获相同的变量i,但回调应该能够引用被查询的帖子。在不做太多更改的情况下,我认为这可以在返回的帖子上使用forEach,如下所示:

// get all the posts
Posts.find((err, posts)=> {

  if (err) { next(err) };
  var data = Array();
  var count = 0;
  var len = posts.length;
  // function to check the end of inner queries
  var checkloop = function(){
    count++;
    if(count===len)
        return res.json({result:data,
                msg:'success'});
    }

  posts.forEach((post) => {
      Users.findOne({email:post.authEmail},(err,usr)=>{
        if(usr){
            var item = {
                        'authorName':usr.name?
                        'email':usr.email,
                        'postDesc':post.desc,
                        'creationTime':post.time
                        }
            data.push(item);

            }
            checkloop();
        }
      });
  });

【讨论】:

    猜你喜欢
    • 2015-08-15
    • 2015-11-19
    • 2021-06-20
    • 1970-01-01
    • 2020-02-26
    • 2019-11-11
    • 1970-01-01
    • 2015-05-20
    • 1970-01-01
    相关资源
    最近更新 更多