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 存储在员工中而不是部门名称中,如果您将来必须重命名部门,则只需在一个地方(在部门文件)。
我的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 存储在员工中而不是部门名称中,如果您将来必须重命名部门,则只需在一个地方(在部门文件)。