Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何计算百分位数?_Mongodb_Mongodb Query_Percentile - Fatal编程技术网

Mongodb 如何计算百分位数?

Mongodb 如何计算百分位数?,mongodb,mongodb-query,percentile,Mongodb,Mongodb Query,Percentile,我在mongodb实例中存储了如下访问日志: 时间服务延迟 [27/08/2013:11:19:22+0000]“售后服务A HTTP/1.1”403 [27/08/2013:11:19:24+0000]“邮政服务B HTTP/1.1”1022 [27/08/2013:11:22:10+0000]“邮政服务A HTTP/1.1”455 Oracle中是否有类似于PERCENTILE\u DISC的分析功能来计算百分比 我想计算一段时间内的延迟百分比。似乎仍然没有计算百分比的原生方法,但通过组合

我在mongodb实例中存储了如下访问日志:

时间服务延迟
[27/08/2013:11:19:22+0000]“售后服务A HTTP/1.1”403
[27/08/2013:11:19:24+0000]“邮政服务B HTTP/1.1”1022
[27/08/2013:11:22:10+0000]“邮政服务A HTTP/1.1”455
Oracle中是否有类似于
PERCENTILE\u DISC
的分析功能来计算百分比


我想计算一段时间内的延迟百分比。

似乎仍然没有计算百分比的原生方法,但通过组合几个聚合运算符,您可以得到相同的结果

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)

注意:我用pymongo编写了我的原始代码,用于解决一个需要在第一组中的3个字段上分组的问题,因此这可能比单个字段所需的更复杂。我会针对这个问题编写一个解决方案,但我认为没有足够的具体信息。

mongo4.4
开始,
$group
阶段有一个新的聚合操作符,允许通过javascript用户定义函数在文档分组时自定义累积文档

因此,为了找到第20个百分位数:

// { "a" : 25, "b" : 12 }
// { "a" : 89, "b" : 73 }
// { "a" : 25, "b" : 7  }
// { "a" : 25, "b" : 17 }
// { "a" : 89, "b" : 14 }
// { "a" : 89, "b" : 17 }
// { "a" : 25, "b" : 24 }
// { "a" : 25, "b" : 15 }
// { "a" : 25, "b" : 22 }
// { "a" : 25, "b" : 94 }
db.collection.aggregate([
  { $group: {
    _id: "$a",
    percentile: {
      $accumulator: {
        accumulateArgs: ["$b"],
        init: function() { return []; },
        accumulate: function(bs, b) { return bs.concat(b); },
        merge: function(bs1, bs2) { return bs1.concat(bs2); },
        finalize: function(bs) {
          bs.sort(function(a, b) { return a - b });
          return bs[Math.floor(bs.length*.2) + 1];
        },
        lang: "js"
      }
    }
  }}
])
// { "_id" : 89, "percentile" : 17 }
// { "_id" : 25, "percentile" : 15 }
蓄能器:

  • 在字段
    b
    上累加(
    acculateargs
  • 初始化为空数组(
    init
  • 在数组中累积
    b
    项(
    acculate
    merge
  • 并最终对
    b
    项目执行百分位数计算(
    finalize

当我看到流放之路交易工具时,我知道它的代码。:)先排序然后分组不起作用吗?而不是分组、展开、排序、再次分组。