我正在与EmberJS和SailsJS合作。现在我被要求制作一个统计页面并处理SailsJS中的过滤过程。
我有一个部门模型和另一个模型请求这些模型之间的关系是(请求属于部门)。出于某种原因,我的经理阻止我建立(hasMany)关系。
现在我要做的是遍历所有部门并将它们存储在新的Object中,在该循环中我想通过使用Request.count({where : { department : department.id }})
遍历所有请求并获取每个部门的请求数量在部门Array Of Object。
我尝试按照我的说法去做,但问题是当我在请求循环中记录部门时,它给出了我想象的结果但是当我添加(.id)时它显示我未定义&#39 ;
这是我的代码:
Department.find().then((departments) => {
report.departments = departments;
Request.count({ department : departments.id}).exec(function countMe(err, count) {
console.log(count);
})
})
PS:如果有任何其他方法可以执行此任务,请告诉我,我是初学者。
答案 0 :(得分:2)
departments
回调中的.then
对象是一个部门对象数组。要获得ID,您需要执行departments[0].id
之类的操作。
我可能不建议使用.count
,因为这意味着要为每个部门单独访问数据库。 Sails waterline可能有一些方法让你计算按部门ID分组的请求,但只是为了得到一个压缩机工作示例,我首先得到所有内容并在你的代码中进行一些处理:
Department.find().then((departments) => {
Request.find().then((requests) => {
var requestCounts = {}; // we'll store the counts in this object
for (var idx = 0; idx < requests.length; idx++) {
if (!requestCounts[requests[idx].department]) {
requestCounts[requests[idx].department] = 0;
}
requestCounts[requests[idx].department]++;
}
// use requestCounts...
});
});
像这样创建一个单独的对象可能不是你想要做的,但是这样的东西应该用于你拥有的任何目的。请注意,我编写的代码不需要查找所有部门对象,但无论您做什么都可能......
如果您对效率感兴趣,那么一旦您开始工作,您就可以看到是否有某种方法可以查询数据库以直接获取您想要的计数而不是此代码内处理。但我会从这样简单的事情开始。
编辑:
听起来你可以使用类似的东西:
Request.find().groupBy('department').sum('count').exec(function (err, results){
console.log(results);
});
但是我发现有关这是否适用于sails-mongo的相互矛盾的报道,所以请将此作为“也许这将起作用”的建议。
答案 1 :(得分:0)
我假设Request有一个属性部门,它是与部门相关的ObjectId。
快速解决以下问题:
DO
让departmentIds = _.map(departments,'id');
并在计数查询对象中使用departmentIds
但是,无论如何,您在初始查询中找到所有部门,我会假设您无论如何都会计算所有请求。首先找到部门只有在你有查询对象时才有意义,这限制了返回部门的数量。
此外,如果您知道有问题的departmentIds,则可能不需要查询它们。否则,您可以使用投影返回departmentIds而不是所有部门的所有属性