使用nodejs和promised-mongo嵌套请求mongodb

时间:2016-03-25 18:45:57

标签: node.js mongodb promise

我有两个mongodb集合,其数据结构如 1.“任务组”集合

{
        "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
        }
    ]
}

即。它应从一个集合中获取“任务组”列表,并计算其他集合中每个条目的条目数。 我用'promised-mongo'编写了这样的代码:

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);
});

但是“func1”无法访问“taskGname”变量,“func2”不会打印任何内容。 我的代码出了什么问题?如何以更好的方式重写它?是否可以通过聚合或其他东西在mongodb的一个请求中进行? 提前谢谢。

1 个答案:

答案 0 :(得分: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);
    });
};