1

我需要找到每个组织级别的重复配置文件总数。我有如下文件:

{
    "OrganizationId" : 10,
    "Profile" : {
        "_id" : "75"
    }
    "_id" : "1"
},
{
    "OrganizationId" : 10,
    "Profile" : {
        "_id" : "75"
    }
    "_id" : "2"
},
{
    "OrganizationId" : 10,
    "Profile" : {
        "_id" : "77"
    }
    "_id" : "3"
},
{
    "OrganizationId" : 10,
    "Profile" : {
        "_id" : "77"
    }
    "_id" : "4"
}

我已经编写了一个由 ProfileId 和 OrganizationId 组成的组的查询。我得到的结果如下所示:

Organization    Total
10               2
10               2

但我想获得每个组织级别的总数,这意味着 Org 10 应该有一行,总和为 4。

我正在使用的查询如下所示:

 db.getSiblingDB("dbName").OrgProfile.aggregate(
 { $project: { _id: 1, P: "$Profile._id",  O: "$OrganizationId" } },
 { $group: {_id: { p: "$P", o: "$O"}, c: { $sum: 1 }} },
 { $match: { c: { $gt: 1 } } });

有任何想法吗 ?请帮忙

4

2 回答 2

3

以下管道应该为您提供所需的输出,而最后一个$project阶段只是为了美观目的,_idOrganizationId对于基本计算不是必需的,因此您可以省略它。

db.getCollection('yourCollection').aggregate([
    { 
        $group: {  
            _id: { org: "$OrganizationId", profile: "$Profile._id" },
            count: { $sum: 1 }
        }
    },
    {
        $group: {
            _id: "$_id.org",
            Total: { 
                $sum: { 
                    $cond: { 
                        if: { $gte: ["$count", 2] }, 
                        then: "$count", 
                        else: 0
                    }
                }
            }
        } 
     },
     {
         $project: {
             _id: 0,
             Organization: "$_id",
             Total: 1
         }
     }
])

给出这个输出

{
    "Total" : 4.0,
    "Organization" : 10
}

要过滤掉没有重复的组织,您可以使用$match这也将简化第二$group阶段

...aggregate([
    { 
        $group: {  
            _id: { org: "$OrganizationId", profile: "$Profile._id" },
            count: { $sum: 1 }
        }
    },
    {
        $match: {
            count: { $gte: 2 } 
        }
    },
    {
        $group: {
            _id: "$_id.org",
            Total: { $sum: "$count" }
        } 
     },
     {
         $project: {
             _id: 0,
             Organization: "$_id",
             Total: 1
         }
     }
])
于 2016-09-18T09:14:40.213 回答
0

我想我有一个解决方案给你。在最后一步,我认为你想要另一个,而不是匹配$group

    .aggregate([

     { $project: { _id: 1, P: "$Profile._id",  O: "$OrganizationId" } }
     ,{ $group: {_id: { p: "$P", o: "$O"}, c: { $sum: 1 }} }
     ,{ $group: { _id: "$_id.o" , c: {  $sum: "$c" } }}

     ]);

您可能可以阅读并弄清楚最后一步发生了什么,但以防万一我会解释。最后一步是将具有相同组织 ID 的所有文档分组,然后将前一个c字段指定的数量相加。在第一组之后,您有两个文档,它们的计数c均为 2,但配置文件 ID 不同。下一组忽略配置文件 ID,如果它们具有相同的组织 ID,则将它们分组并添加它们的计数。

当我运行此查询时,这是我的结果,这就是我认为您正在寻找的结果:

{
    "_id" : 10,
    "c" : 4
}

希望这可以帮助。如果您有任何问题,请告诉我。

于 2016-09-17T20:53:21.357 回答