依靠mongodb的聚合

时间:2014-05-31 11:02:52

标签: mongodb count aggregation-framework

这是我对pymongo聚合的查询:

db.connection_log.aggregate([
    { '$match': {
        'login_time': {'$gte': datetime.datetime(2014, 5, 30, 6, 57)}
    }},
    { '$group': {
        '_id': {
            'username': '$username',
            'ras_id': '$ras_id',
            'user_id': '$user_id'
        }, 
        'total': { '$sum': '$type_details.in_bytes'}, 
        'total1': {'$sum': '$type_details.out_bytes'}
    }}, 
    { '$sort': {'total': 1, 'total1': 1}}
])

如何计算聚合中的所有结果?

2 个答案:

答案 0 :(得分:0)

添加到汇总管道的末尾:

$group: {
    _id:null,
    count:{
        $sum:1
    }
}

SQL to Aggregation Mapping Chart

答案 1 :(得分:0)

如果你真的希望你的结果与总计数相结合,那么你总是可以将结果推送到他们自己的数组中:

result = db.connection_log.aggregate([
    { '$match': {
        'login_time': {'$gte': datetime.datetime(2014, 5, 30, 6, 57)}
    }},
    { '$group': {
        '_id': {
            'username': '$username',
            'ras_id': '$ras_id',
            'user_id': '$user_id'
        }, 
        'total': { '$sum': '$type_details.in_bytes'}, 
        'total1': {'$sum': '$type_details.out_bytes'}
    }}, 
    { '$sort': {'total': 1, 'total1': 1}},
    { '$group' {
        '_id': null,
        'results': { 
            '$push': {
               '_id': '$_id',
               'total': '$total',
               'total1': '$total1'
            }
        },
        'count': { '$sum': 1 }
    }}
])

如果您使用的是MongoDB 2.6或更高版本,则可以'$push': '$$ROOT'而不是实际指定那里的所有文档字段。

但实际上,除非您使用的是MongoDB 2.6并且明确要求将游标作为结果,否则该结果实际上已作为数组返回,而不会为具有计数的结果添加内部数组。所以只需得到数组的长度,在python中是:

len(result)

如果您确实将光标用于大型结果集或以其他方式使用$limit$skip至" page"结果然后你需要做两个查询,其中一个只是总结"总计数",否则你不需要这样做。