收集与以下文件类似的文件:
{
"_id" : ObjectId("5dc027718da295b969e529ae"),
"emp_no" : 10001,
"gender" : "M",
"titles" : [
{
"title" : "Senior Engineer",
"dept_name" : "Development",
"from_date" : "1986-06-26",
"to_date" : "9999-01-01"
},
{
"title" : "Staff",
"dept_name" : "Human Resources",
"from_date" : "1986-06-26",
"to_date" : "9999-01-01"
}
]
}
我如何计算某个部门有多少个 M 正在工作,以便得到类似Development:874505的结果?
我有另一个集合,其中包含以下文件:
//one document
{
"_id" : ObjectId("5dc026438da295b969e01893"),
"dept_no" : "d005",
"dept_name" : "Development",
"emp_no" : 10001,
"from_date" : "1986-06-26",
"to_date" : "9999-01-01"
}
//another document
{
"_id" : ObjectId("5dc026438da295b969e01894"),
"dept_no" : "d003",
"dept_name" : "Human Resources",
"emp_no" : 10001,
"from_date" : "1986-06-26",
"to_date" : "9999-01-01"
}
也许使用这个可以使这个过程更容易?
我如何计算某个部门有多少个 M 正在工作,以便得到类似Development:874505的结果?
聚合查询:
在$unwind
得到所有的子文档元素titles
的数组。然后我们通过gender
和匹配那些dept_name
。最后,数一数。该$group
阶段确保在同一部门担任两个角色的员工算作一个。
var deptMatch = "Development";
db.emps.aggregate( [
{ $unwind: "$titles" },
{ $match: { gender: "M", "titles.dept_name": deptMatch } },
{ $group: { _id: "$emp_no" } },
{ $count: deptMatch }
] )
注意:如果有很多文件,我建议您将性别匹配放在放松阶段之前。您将在以下阶段处理较少数量的文件。
我使用此示例数据(为简洁起见删除了一些字段)来获得以下结果:
{ "Development" : 3 }
集合emps
的文件:
{
"_id" : 1,
"emp_no" : 10001,
"gender" : "M",
"titles" : [
{ "title" : "Senior Engineer", "dept_name" : "Development" },
{ "title" : "Staff", "dept_name" : "Human Resources" }
]
},
{
"_id" : 2,
"emp_no" : 10002,
"gender" : "M",
"titles" : [
{ "dept_name" : "Development" }
]
},
{
"_id" : 3,
"emp_no" : 10009,
"gender" : "F",
"titles" : [
{ "dept_name" : "Procurement" }
]
}
{
"_id" : 4,
"emp_no" : 10004,
"gender" : "M",
"titles" : [
{ "dept_name" : "HR" },
{ "dept_name" : "Procurement" }
]
}
{ "_id" : 5,
"emp_no" : 10012,
"gender" : "M", "titles" : [
{ "title" : "Staff", "dept_name" : "Development" },
{ "title" : "Senior Staff", "dept_name" : "Development" }
]
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句