如何将一个查询的对象用于Mongoose中的嵌套查询

我在MongoDb和NodeJs中是新的,我在nodejs中使用Mongoose,但是我面临一个问题,我使用第一个查询的结果对象到嵌套查询,但获取第一个查询对象的未定义。 请给我任何build议。 谢谢。

LuckyLunch.find(criteria, function (err, lunches) { // First Query if (err) return; var allLunches = lunches; // Accurate result here for (var i = 0; i < allLunches.length; i++) { if (typeof allLunches[i].luckyMatch != 'undefined') { var usernames = []; Match.findOne(criteria2, function (err, singleMatch) { // Second Query if (singleMatch != null) { var userids = []; for (var k = 0; k < singleMatch.participants.length; k++) { userids.push(ObjectId(singleMatch.participants[k])); } User.find(criteria, function (err, getusers) { // Third Query for (var j = 0; j < getusers.length; j++) usernames.push(getusers[j].name); allLunches[i].luckyUsers = usernames; // allLunches[i] is undefined here. }); } }); } } }); 

尝试这个,

  var getData = function(callback) { LuckyLunch.find(criteria, function (err, lunches) { // First Query if (err) { callback(err); return; } var len = lunches.length; // try to use lenches only, Accurate result here for (var i = 0; i < len; i++) { (function(i) { if (typeof lunches[i].luckyMatch != 'undefined') { var usernames = []; Match.findOne(criteria2, function (err, singleMatch) { // Second Query if (singleMatch) { var userids = []; for (var k = 0; k < singleMatch.participants.length; k++) { userids.push(ObjectId(singleMatch.participants[k])); } User.find(criteria, function (err, getusers) { // Third Query for (var j = 0; j < getusers.length; j++) usernames.push(getusers[j].name); lunches[i].luckyUsers = usernames; // allLunches[i] is undefined here. }); } }); } })(i); } callback(null, "put here need data to return"); //this must be end of the ur loop }); } getData(function(err, result){ if(err) console.log(err); else console.log(result); }); 

经过一些改变,我得到了我的结果。 我的答案是:

 var getData = function (id,callback) { var criteria = { luckyMatch: { $exists: true }, companyid: ObjectId(id) } LuckyLunch.find(criteria, function (err, lunches) { // First Query var len = lunches.length; // try to use lenches only, Accurate result here for (var i = 0; i < len; i++) { (function (i) { if (typeof lunches[i].luckyMatch != 'undefined') { var usernames = []; var criteria2 = { participants: { $exists: true, $ne: [] }, _id: ObjectId(lunches[i].luckyMatch) } Match.findOne(criteria2, function (err, singleMatch) { // Second Query if (singleMatch) { var userids = []; var len2 = singleMatch.participants.length; for (var k = 0; k < len2; k++) { userids.push(ObjectId(singleMatch.participants[k])); } var criteria3 = { _id: { $in: userids } } User.find(criteria3, function (err, getusers) { // Third Query var len3 = getusers.length; for (var n = 0; n < len3; n++) { lunches[i].luckyUsers.push(getusers[n].name); } if (i == len - 1) callback(null, lunches); //this must be end of the ur loop }); } }); } })(i); } }); }