How to calculate the percentile?

mongodb, mongodb-query, percentile

Solution

There still appears to be no native way to calculate percentiles but by combining a few aggregate operators you can get the same result.

db.items.aggregate([
        {'$group': {
            '_id': {
                'league': '$league',
                'base': '$base',
                'type': '$type'
            },
            'value': {'$push': '$chaosequiv'}
        }},
        {'$unwind': '$value'},
        {'$sort': {'value': 1}},
        {'$group': {'_id': '$_id', 'value': {'$push': '$value'}}},
        {'$project': {
            '_id': 1,
            'value': {'$arrayElemAt': ['$value', {'$floor': {'$multiply': [0.25, {'$size': '$value'}]}}]}
        }}
    ], allowDiskUse=True)

Note I wrote my original code in pymongo for a problem that needed to group on 3 fields in the first group so this may be more complex than necessary for a single field. I would write a solution specific to this question but I don't think there is enough specific information.

Problem

I have access logs such as below stored in a mongodb instance: ``` Time Service Latency [27/08/2013:11:19:22 +0000] "POST Service A HTTP/1.1" 403 [27/08/2013:11:19:24 +0000] "POST Service B HTTP/1.1" 1022 [27/08/2013:11:22:10 +0000] "POST Service A HTTP/1.1" 455 ``` Is there an analytics function like `PERCENTILE_DISC` in Oracle to calculate the percentile? I would like to calculate latency percentiles over a period of time.

Original source