繁体   English   中英

依靠mongodb中的聚合

[英]count on aggregate in mongodb

这是我在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}}
])

如何计算所有结果的总和?

添加到聚合管道的末尾:

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

SQL到聚合的映射图

好吧,如果您真的希望将结果与总计数相加,那么您始终可以将结果放入自己的数组中:

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来“分页”结果,那么您将需要执行两个查询,其中一个只是汇总“总数”,但是否则您不这样做不需要这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM