多个密钥的总计

时间:2015-09-03 21:59:25

标签: python mongodb mongodb-query pymongo aggregation-framework

下面给出了文档的以下数据结构:

{u'ok': 1.0, u'result': [
    {
        u'_id': {u'device_os_id': 2, u'device_status_id': 2},
        u'total': $sum, 
        u'models': {
            'device_model_id': 1,
            'total_device_model': $sum
        } 
    },
    {
        u'_id': {u'device_os_id': 1, u'device_status_id': 1},
        u'total': $sum, 
        u'models': {
            'device_model_id': 4,
            'total_device_model': $sum
        } 
    },
    .....    

我想通过device_status和device_os对数据进行分组:

testing = self.collection.aggregate([
    {'$group': {
    '_id': {'device_os_id': "$device_os_id", 'status': '$device_status_id'},
            'total': {'$sum': 1},
            'models': {'$addToSet': "$device_model_id"},
        }}
    ])

到目前为止,我有以下代码:

{u'ok': 1.0, u'result': [
{u'total': 20355, u'models': [18, 2, 3], u'_id': {u'device_os_id': 2, u'status': 2}}, 
{u'total': 38429, u'models': [18, 19, 2, 3], u'_id': {u'device_os_id': 2, u'status': 1}}, 
{u'total': 1, u'models': [15], u'_id': {u'device_os_id': 1.0, u'status': 1}}]}

给了我以下结果:

=DateAdd(m, -30, GetDate())

我还没有办法将每个device_model_id的总和添加到'模型'名单。 有谁知道我怎么能做到这一点? 非常感谢你的帮助。

1 个答案:

答案 0 :(得分:2)

您可以在两个$group管道阶段执行此操作,首先是所有键,包括" model"然后只是为了更低层次的细节:

self.collection.aggregate([
    { '$group': {
        '_id': {
            'device_os_id': "$device_os_id", 
            'status': '$device_status_id',
            'model': '$device_model_id'
        },
        'total': {'$sum': 1}
    }},
    { '$group': {
        '_id': {
            'device_os_id': '$_id.device_os_id', 
            'status': '$_id.status'},
        },
        'models': { '$push': { 'model': '$_id.model', 'total': '$total' } },
        'total': { '$sum': '$total' }
    }}
])

作为"管道"第一阶段在一个级别压缩并获得详细信息总数。所有"秒"阶段正在做的是折叠现在已经独特的内容" model"分成一系列"模型"将其他分组项目作为关键。