【发布时间】:2020-09-26 08:44:35
【问题描述】:
数据库概览
我有两个集合 - 第一个是员工详细信息,第二个是他们在某些部门的成员身份。
Emps 集合样本(大小约为 331.5k 个文档):
{
"_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"
}
]
}
departments 集合样本(大小约为 300k 文档):
{
"_id" : ObjectId("5dc026438da295b969e01893"),
"dept_no" : "d005",
"dept_name" : "Development",
"emp_no" : 10001,
"from_date" : "1986-06-26",
"to_date" : "9999-01-01"
},
{
"_id" : ObjectId("5dc026438da295b969e01894"),
"dept_no" : "d003",
"dept_name" : "Human Resources",
"emp_no" : 10001,
"from_date" : "1986-06-26",
"to_date" : "9999-01-01"
}
问题
现在我如何计算每个部门有多少gender 等于M 的员工?到目前为止,我想出了这个查询:
db.getCollection("emps").aggregate([
{$match: {'gender': 'F'}},
{$project: {_id: 0, emp_no: 1, gender: 1}},
{$lookup: {
from: 'departments',
localField: 'emp_no',
foreignField: 'emp_no',
as: 'departments',
}},
])
但它缺少关键阶段,例如
-
to_date为"9999-01-01"的条件表示该员工仍在部门工作, - 按部门名称分组
我希望查询尽可能高效,因此我尽量避免使用$unwind,因为它会生成更多文档。有没有其他方法可以在没有$unwind 阶段的情况下到达内部数组元素?
最后一件事 - 我看到可以在 $lookup 中使用管道,因此我可以通过在查找的文档上进行投影来摆脱我不感兴趣的字段,但我没有设法自己正确地做到这一点。如果你知道怎么做,请告诉我。
提前感谢您的帮助!
【问题讨论】:
标签: mongodb mongodb-query aggregation-framework