首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mongoDB -聚合上的聚合?

mongoDB -聚合上的聚合?
EN

Stack Overflow用户
提问于 2013-06-05 01:15:48
回答 1查看 682关注 0票数 1

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

代码语言:javascript
复制
{
     "_id" : ObjectId( "51ac1356c59151b66c0c9b6b" ),
     "device" : "SomeString",
     "carrier" : "Cell C(ZA)"
}

我要找的是一个不同载波的列表,每个载波的设备数量和每个设备的设备数量。

到目前为止,我尝试过的是:

代码语言:javascript
复制
db.records.aggregate(
    { $project : {
       carrier : 1,
       device : 1,
    } },
    { $group : {
        _id : { carrier : "$carrier" },
        numDevice : {$sum:1},
        devices : { $addToSet : "$device"}
     } },
     { $sort: { numDevice: 1 }
});

这是输出:

代码语言:javascript
复制
{ "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 }

这是非常接近我所需/想要的,但理想情况下,我希望看到每个“设备”部分如下所示:

代码语言:javascript
复制
            {
                    "_id" : {
                            "carrier" : "AT&FU (US)"
                    },
                    "numDevice" : 315,
                    "devices" : [
                        {"SomeString1", 83},
                        {"SomeString2", 17},
                        {"SomeString5", 215},
                    ]
            }

注意,设备数组有对象,每个对象有一个字符串有一个计数。在上面的示例中,设备SomeString1在“AT&FU(US)”carrier的集合中有83‘出现’

目前,我所能发现的是carrier'AT&FU (美国)‘有392个"SomeStringX“与之相关。

可以通过对聚合管道的子调用来做到这一点,或者我是否需要使用map还原?--如果我需要进行映射减少,我将如何做呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-05 05:41:02

这是怎么做的。关键是:(a)您需要执行两次$group,以及(b)您需要首先按您想要的小计进行$group,然后通过$group获得总计。

代码语言:javascript
复制
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"}}   
     }
)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16930039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档