mongoDB-聚合上的聚合?

mongoDB-聚合上的聚合?,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有大约500条这种格式的记录: { "_id" : ObjectId( "51ac1356c59151b66c0c9b6b" ), "device" : "SomeString", "carrier" : "Cell C(ZA)" } 我要找的是不同运营商的列表,每个运营商的设备数量和每个设备的设备数量 以下是我迄今为止所尝试的: db.records.aggregate( { $project : { carrier : 1,

我有大约500条这种格式的记录:

{
     "_id" : ObjectId( "51ac1356c59151b66c0c9b6b" ),
     "device" : "SomeString",
     "carrier" : "Cell C(ZA)"
}
我要找的是不同运营商的列表,每个运营商的设备数量和每个设备的设备数量

以下是我迄今为止所尝试的:

db.records.aggregate(
    { $project : {
       carrier : 1,
       device : 1,
    } },
    { $group : {
        _id : { carrier : "$carrier" },
        numDevice : {$sum:1},
        devices : { $addToSet : "$device"}
     } },
     { $sort: { numDevice: 1 }
});
以下是输出:

{ "result" : [
            {
                    "_id" : {
                            "carrier" : "Saudi Telecom Company (SA)"
                    },
                    "numDevice" : 229,
                    "devices" : [
                            "SomeString1",
                            "SomeString2
                    ]
            },
            {
                    "_id" : {
                            "carrier" : "AT&FU (US)"
                    },
                    "numDevice" : 392,
                    "devices" : [
                            "SomeString1",
                            "SomeString2",
                            "SomeString3"
                    ]
            }

], "ok" : 1 }
这与我需要/想要的非常接近,但理想情况下,我希望看到每个设备部分如下所示:

            {
                    "_id" : {
                            "carrier" : "AT&FU (US)"
                    },
                    "numDevice" : 315,
                    "devices" : [
                        {"SomeString1", 83},
                        {"SomeString2", 17},
                        {"SomeString5", 215},
                    ]
            }
请注意,devices数组有多个对象,每个对象都有一个字符串和一个计数。在上面的示例中,设备SomeString1在“AT&FU US”运营商的集合中有83个“事件”

目前,我所能发现的是,运营商“AT&FU US”有392个SomeStringX与之相关


可以通过对聚合管道的子调用来实现这一点,还是需要使用map reduce?如果我需要执行map reduce,我将如何执行它?

下面是如何执行的。关键是a你需要做$group两次,b你需要先按你想要的小计进行$group,然后再进行$group以获得总计

db.records.aggregate(
     {$group:
        {_id : {d:"$device",c:"$carrier"},
         subtotal:{$sum:1}}
     }, 
     {$group:
        {_id:"$_id.c", 
         devices:{$push:{device:"$_id.d", subtotal:"$subtotal"}}, 
         total:{$sum:"$subtotal"}}   
     }
)

下面是如何做到这一点。关键是a你需要做$group两次,b你需要先按你想要的小计进行$group,然后再进行$group以获得总计

db.records.aggregate(
     {$group:
        {_id : {d:"$device",c:"$carrier"},
         subtotal:{$sum:1}}
     }, 
     {$group:
        {_id:"$_id.c", 
         devices:{$push:{device:"$_id.d", subtotal:"$subtotal"}}, 
         total:{$sum:"$subtotal"}}   
     }
)

您可以使用聚合框架来实现这一点。我可以发布答案,或者我可以先给你一个提示,如果你想自己解决这个问题……你可以用聚合框架来完成。我可以把答案贴出来,或者我可以先给你一个提示,如果你想自己弄明白的话……谢谢你,这正是我需要的。我知道我可以通过管道发送多个组请求,但我不认为每个设备和运营商都有第一个ID。我会投票支持这一点,但我仍然没有15分的“声誉”。多谢,这是我的荣幸。这个聚合技巧的酷之处在于,一旦你看到它,你就会意识到它可以用于各种有用的多级聚合……谢谢你,这正是我所需要的。我知道我可以通过管道发送多个组请求,但我不认为每个设备和运营商都有第一个ID。我会投票支持这一点,但我仍然没有15分的“声誉”。多谢,这是我的荣幸。这个聚合技巧最酷的一点是,一旦你看到它,你就会意识到它可以用于各种有用的多级聚合。。。