我有两个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的一个请求中进行? 提前谢谢。
答案 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);
});
};