MongoDB设置从聚合组接收的交集传递数组结果

时间:2014-07-18 11:50:59

标签: mongodb

  

你好

     

我有一个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"]}
                 }
    })
  

可以请任何人帮忙。

     

谢谢&问候   阿贾伊

1 个答案:

答案 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阶段。