2016-06-22 113 views
0

我没有从嵌套查询中得到结果,loc始终为空。查询参数在打印时具有适当的值,数据库集合'users'具有来自数组friendsP的id的文档。Mongodb与节点js的嵌套查询

var acquireFriendsPositions = function(db, id, res, callback) { 
    var cursor = db.collection('users').find({"_id" : new ObjectId(id)}, {_id:0, friends:1}); 
    cursor.each(function(err, doc) { 
     assert.equal(err, null); 
     if (doc != null) { 
     friendsP = doc.friends; 
     console.log(friendsP); //I get the array friendsP 
     for(var i =0; i<friendsP.length; i++) 
     { 
      console.log(friendsP[i]); //friendsP[i] has proper value 
      var curs = db.collection('users').find({"_id" : new ObjectId(friendsP[i])}); //but query returns null 
      curs.each(function(err, loc) { 
      //assert.equal(err, null); 
      if(loc!= null) { 
       console.log(loc); 
       friendsPos.push(loc); 
       } 
       else { 
       console.log("else"); 
       } 
      }); 
     } 
     promise(friendsPos, res); //here i wait for friendsPos and use it in res.send(), but friendsPos is empty because loc is always null 
     } else { 
     callback(); //callback does db.close(); 
     } 
    }); 
}; 

回答

0

如果这是您使用我怀疑friendsP值被吊起并在下一周期each覆盖确切的代码。这意味着您应该可以通过将代码更改为var friendsP = doc.friends来解决此问题,以便friendsP变量处于函数范围内。如果这是发生了什么,这是一个讨厌的错误,你应该总是声明变量与本地范围,以防止这种情况发生。

+0

感谢Vasil,但它与本地变量friendsP一样。另外,游标只包含一个文档,因为我通过id查询。看起来我需要dbref? –

0

尝试使用这种铸造对象ID:

var mongodb = require('mongodb'); 

mongodb.ObjectID.createFromHexString(friendsP[i]); 
0

谢谢你,伙计们。实际上,问题是在执行查询之前关闭连接的callback()。这是我的新代码:

var acquireFriendsPositions = function(db, id, res, callback) { 
    db.collection('users').findOne({"_id" : new ObjectId(id)}, 
    function(err, item) { 
    var friendsP = item.friends; 
    var locFriends = []; 
    promise(locFriends, res); 
    var x = 0; 
    for(i =0; i<friendsP.length; i++) 
    { 
     db.collection('users').findOne({"_id" : friendsP[i]}, function(err,subItem){ 
     x=x+1; 
     //console.log(subItem); 
     locFriends.push(subItem); 
     if(x==friendsP.length) 
      callback(); 
     }); 
    } 
    }); 
};