亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在 go mongodb 中的 From Table 上匹配階段

在 go mongodb 中的 From Table 上匹配階段

Go
胡子哥哥 2022-06-21 16:47:33
我的 mongodb 收藏employee{  _id:ObjectId(),  "emp_name":"qwert",  "emp_id":111,  "emp_dept":"XYZ"  "qualification":"PHD"}{_id:ObjectId(),  "emp_name":"asdfg",  "emp_id":121,  "emp_dept":"XYZ" "qualification":"MBA"}department{_id:ObjectId(),"dept_id":11,"dept_name":"XYZ","description":"decs",}我的 Go 代碼是 type Employee struct {    EmployeeName  string             `json:"emp_name" bson:"emp_name"`    EmployeeID    int                `json:"emp_id" bson:"emp_id"`    EmployeeDept  string             `json:"emp_dept" bson:"emp_dept"`    EmpQualification string          `json:"qualification" bson:"quaification"`     EmpDepartment Department         `json:"department" bson:"department"` } type Department struct {    DepartmentID    int                `json:"dept_id" bson:"dept_id"`    DepartmentName  string             `json:"dept_name" bson:"dept_name"`     Description     string             `json:"description" bson:"description"`     EmployeeList    []Employee         `json:"employee_list" bson:"employee_list"`}collection := session.DB("db").C("department")pipeline := collection.Pipe([]bson.M{        {"$lookup": bson.M{        "from":         "employee",        "localField":   "dept_name",        "foreignField": "emp_dept",        "as":           "employee_list",    }},      {"$match": bson.M{        "qualification": "PHD",          }},    })err = pipeline.All(&departmentEmployees)它顯示空結果我想從我的部門集合中獲取所有部門,每個部門都有“PHD”資格的員工列表。我已將我的集合和結構上傳為示例。如何在查找表中使用匹配字段。我想得到像{    dept_id:11,   dept_name:'XYZ'   description:'desc'   employee_list:[     {     emp_name:"qwerty"     emp_id:111,     qualification:'PHD'      }     {     emp_name:"asdfg"     emp_id:222,     qualification:'PHD'      }...]} {    dept_id:12,   dept_name:'ABC'   description:'descwe'   employee_list:[     {     emp_name:"bjgk"     emp_id:865,     qualification:'PHD'      }     {     emp_name:"hkj"     emp_id:967,     qualification:'PHD'      }...]}對于第一所大學,讓所有員工獲得博士學位,然后在第二所大學獲得博士學位,依此類推。我很困惑我是否必須在查找中使用 group by in 從集合中?
查看完整描述

1 回答

?
慕容3067478

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 存儲在員工中而不是部門名稱中,如果將來必須重命名部門,則只需在一個地方(在部門文檔中)更改它。


查看完整回答
反對 回復 2022-06-21
  • 1 回答
  • 0 關注
  • 120 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號