【问题标题】:Aggregate totals for Multiple Keys多个键的总计
【发布时间】:2015-09-03 21:59:24
【问题描述】:

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

{
    "_id" : x,
    "device_model_id": x,
    "device_os_id": x,
    "device_status_id" : x,
}

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

{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
        } 
    },
    .....    

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

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}}]}

我还没有找到将每个 device_model_id 的总和添加到“模型”列表的方法。 有谁知道我怎么能做到这一点? 非常感谢您的帮助。

【问题讨论】:

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


    【解决方案1】:

    您在两个$group 管道阶段执行此操作,首先通过包括“模型”在内的所有键,然后仅用于较低级别的详细信息:

    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' }
        }}
    ])
    

    作为“管道”,第一阶段浓缩在一个级别并获取详细信息总计。 “第二”阶段所做的就是将“模型”现在已经唯一的内容折叠到“模型”数组中,其他分组项作为键。

    【讨论】:

    • 这太完美了!谢谢
    猜你喜欢
    • 2014-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2017-03-25
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多