From Table in go mongodb 比赛阶段

Match Stage on From Table in go mongodb

我的mongodbcollections

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",
}

我的围棋代码是

 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)

显示空结果

我想获得我部门 collection 的所有部门,每个部门都有 'PHD' 资格的员工列表。我已经上传了我的 collections 和结构 Example.How 以在查找中使用来自 table 的匹配字段。

我想得到像

这样的输出
{
    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' 
     }
...
]}

对于第一所大学,所有员工都拥有博士学位,然后对于第二所大学,所以 on.I 很困惑,我是否必须在查找中使用来自 collection 的 group by in?

首先,您的 Employee.EmpQualification 字段标签中有错字:

EmpQualification string `json:"qualification" bson:"quaification"`

应该是:

EmpQualification string `json:"qualification" bson:"qualification"`

接下来,当您将员工查找为 employee_list 时,这将是结果中的一个新字段,因此 qualification 将引用 department 的字段,而不是 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 存储在员工中而不是部门名称中,如果您将来必须重命名部门,则只需在一个地方(在部门文件)。