1 回答
TA贡献1773条经验 获得超3个赞
首先,您的Employee.EmpQualification字段标签中有错字:
EmpQualification string `json:"qualification" bson:"quaification"`
它应该是:
EmpQualification string `json:"qualification" bson:"qualification"`
接下来,当您将员工查找为 时employee_list,这将是结果中的一个新字段,因此qualification将引用员工的字段department而不是员工的字段。
既然employee_list是一个数组,你不能简单地匹配,你必须过滤数组,并用employee_list新的过滤数组替换。
最后,您可能希望排除没有任何具有“PHD”资格的员工的部门。
最终的聚合如下所示:
pipeline := collection.Pipe([]bson.M{
{"$lookup": bson.M{
"from": "employee",
"localField": "dept_name",
"foreignField": "emp_dept",
"as": "employee_list",
}},
{
"$addFields": bson.M{
"employee_list": bson.M{
"$filter": bson.M{
"input": "$employee_list",
"as": "emp",
"cond": bson.M{
"$eq": []interface{}{"$$emp.qualification", "PHD"},
},
},
},
},
},
{"$match": bson.M{
"employee_list": bson.M{"$not": bson.M{"$size": 0}},
}},
})
另请注意,上述聚合必须搜索所有部门及其员工。更好的方法是从员工开始,按资格筛选,然后按部门分组。
扩展第二种方法:一旦您拥有拥有 PHD 的员工,将员工分组emp_dept并聚集在 中employee_list,然后查找部门。然后你必须“构建”结果文档,即查找的部门必须是附加的emplyee_list(在阶段期间收集的$group)的“根”。
这就是它的样子:
pipeline := collection.Pipe([]bson.M{
{"$match": bson.M{
"qualification": "PHD",
}},
{"$group": bson.M{
"_id": "$emp_dept",
"employee_list": bson.M{"$push": "$$ROOT"},
}},
{"$lookup": bson.M{
"from": "department",
"localField": "_id",
"foreignField": "dept_name",
"as": "department",
}},
{"$unwind": "$department"},
{"$replaceRoot": bson.M{
"newRoot": bson.M{
"$mergeObjects": []interface{}{
"$department",
bson.M{"employee_list": "$employee_list"},
},
},
}},
})
第二种方法的优点是它只处理拥有 PHD 的员工(确保有一个索引),只加载拥有此类员工的部门。
另请注意,最好将部门 ID 存储在员工中而不是部门名称中,如果将来必须重命名部门,则只需在一个地方(在部门文档中)更改它。
- 1 回答
- 0 关注
- 103 浏览
添加回答
举报