2016-03-25 2 views
0

у меня есть две коллекции MongoDB со структурами данных, как коллекции 1. "Taskgroups"Вложенные запросы в MongoDB с nodejs и обещал-Монго

{ 
     "taskgroup" : "M&MS&C_nEmpty", 
     "arg" : "1", "res" : ["1", "0", "0.1"] 
} 

и 2. "Результаты" коллекции

{ 
     "taskgroup" : "M&MS&C_nEmpty", 
     "annotation" : { 
      "fullDesc" : "result contains M MS C", 
      "shortDesc" : "veryAwesomeRes", 
      "colCount" : 4, 
      "argCol": "kT", 
      "cols" : ["M", "MS", "C"] 
     } 
} 

Мне нужно сделать nodejs с выраженной конечной точкой, которая вернется

{ 
    "taskgroupsResCount" : [ 
     { 
      "taskgroup": "DEADBEEF", 
      "resultCount" : 1337 
     }, 
     { 
      "taskgroup": "1CED7EA", 
      "resultCount" : 7331 
     } 
    ] 
} 

т. Е. Он shoul получает список «taskgroups» из одной коллекции и подсчитывает количество записей для каждого из них в другой коллекции. я написал код с «обещал-Монго», как это:

var db = pmongo(dbName); 
var tgCollection = db.collection(tgCollectionName); 
var resCollection = db.collection(resCollectionName); 
var resultArray = []; 
tgCollection 
.find() 
.forEach(function(tg){ 
    var taskGname = tg.taskgroup; 
    console.log(taskGname); 
    resCollection 
    .find({"taskgroup" : tg.taskgroup}) 
    .then(function(resArray){    //func1 
     console.log(resArray.length); 
     resultArray.push(resArray.length); 
    }); 
}) 
.then(function(){       //func2 
    console.log(resultArray); 
}); 

, но переменная «taskGname» недоступен из «func1» и «func2» не печатает ничего. Что случилось с моим кодом? Как переписать его лучше? Можно ли сделать это в одном запросе mongodb с агрегацией или другим материалом? Благодарим заранее.

ответ

0

Я нашел решение.

function getResultCountByTaskGroup(taskGroup) { 
    var defer = Q.defer(); 
    resCollection 
    .find({taskgroup:taskGroup.taskgroup})  //get list of all results for teskgroup 
    .then(function(result){ 
     var resItem = {       //creating of object that will be responded as a part of response array 
      "taskGroup" : taskGroup.taskgroup, 
      "resCount" : result.length 
     }; 
     //console.log(taskGroup.taskgroup); 
     //console.log(result.length); 
     console.log(resItem); 
     defer.resolve(resItem); 
    }); 
    return defer.promise; 
} 

exports.getResCountByTaskGroup = function(req, res) { 
    console.log('Retrieving list of taskgroups and counts'); 
    tgCollection 
    .find()      //get all docs from result collection 
    .then(function(results){ //results - array that contains all items from taskgroups collection 
     return Q.forEach(results, getResultCountByTaskGroup); //runs getResultCountByTaskGroup() function for every item of results array 
    }) 
    .then(function(somethingReturned){ //somethingReturned is array of getResultCountByTaskGroup() results 
     //console.log(somethingReturned); 
     var objectForResponse = {}; 
     objectForResponse.taskgroupsResCount = somethingReturned; 
     res.send(objectForResponse); 
    }); 
}; 
Смежные вопросы