Mongodb 如何计算百分位数?
我在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的分析功能来计算百分比 我想计算一段时间内的延迟百分比。似乎仍然没有计算百分比的原生方法,但通过组合
时间服务延迟
[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