你好
我有一个CompanyDepartmentJobRole的集合,如下所示
CompanyID Department JobRoleID
------------------------------------------
1 D1 J1
1 D1 J2
1 D1 J3
1 D1 J4
1 D2 J5
1 D2 J1
我想使用setIntersection在各个部门中找到Common JobRole。
我可以分组并获取部门中的JobRoles数组,但是现在我想将收到的结果传递给setIntersection但不知道如何提供它。
以下是对deparmentes进行分组并获取JobRoles数组的查询
db.CompanyDepartmentJobRole.aggregate( {$group : {
_id : "$DepartmentID",
JobRole: { $addToSet: "$JobRoleID" }
} } )
将结果返回为
D1 D2
---- ----
J1 J5
J2 J1
J3
J4
但是不知道如何将此结果传递给setIntersection,我正在尝试下面的查询但不正确的方式
db.CompanyDepartmentJobRole.aggregate( {$group : {
_id : "$DepartmentID",
JobRole: { $addToSet: "$JobRoleID" }
} },
{'$project': {
int:{$setIntersection:["$JobRole"]}
}
})
可以请任何人帮忙。
谢谢&问候 阿贾伊
答案 0 :(得分:0)
setIntersection
是投影操作符,不能用于查找两个不同文档中数组之间的交集。您可以使用以下聚合查询计算多个部门中存在的JobRoleID
集:
> db.so.aggregate([
{$group: {_id: "$DepartmentID", JobRoleID: {$addToSet: "$JobRoleID"}}},
{$unwind: "$JobRoleID"},
{$group: {_id: "$JobRoleID", count: {$sum: 1}}},
{$match: {count: {$gt: 1}}}
])
首先计算部门中存在的JobRoleID
集合,然后计算每个JobRoleID
在某个部门的集合中出现的次数,并且只返回至少发生的那些两次。如果要限制特定部门,可以在开头放入$ match阶段。