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 關注
- 120 瀏覽
添加回答
舉報