gpt4 book ai didi

php - 有效地计算 MongoDB 中出现的百分比

转载 作者:可可西里 更新时间:2023-11-01 09:28:32 24 4
gpt4 key购买 nike

所以,我正在修补 MongoDB,我正在尝试让 count() 聚合查询适本地缩放,以便让我轻松地计算某些值出现的百分比整个集合中的文档。

我有一个结构如下的文档:

{
foo : 'bar',
moo : 'cow',
values : {
alpha : true,
beta : false,
gamma : false,
delta : true ... (many more)
}
}

现在,我有几千个这样的文档,我想有效地计算 values 对象(在我的例子中)中所有值的正确百分比(或错误百分比) , 有 ~50).即,有多少百分比的时间 alpha 为真,beta 为真等。

我天真地从 count() 开始,但它似乎一次只允许一个查询,所以这导致我这样做(使用 PHP Mongo 类,但它基本上只是一个常规 count() 函数:

 $array_of_keys = array('alpha', 'beta', 'gamma', 'delta'...);
for($i=0;$i<count($array_of_keys);$i++){
$array_of_keys = [...]
for($i=0;$i<count($array_of_keys);$i++){

$false = intval($collection->count(array($array_of_keys[$i]=>false)));
$true = intval($collection->count(array($array_of_keys[$i]=>true)));
}

但即使记录数量非常少(大约 100 条),这也需要 9 秒。

最好的方法是什么?

最佳答案

这是一个简单的 MapReduce那会做你想做的:

map = function() {
for (var key in this.values){
emit(key, {count:1, trues: (this.values[key] ? 1 : 0)});
}
}

reduce = function(key, values){
var out = values[0];
for (var i=1; i < values.length; i++){
out.count += values[i].count;
out.trues += values[i].trues;
}
return out;
}

finalize = function(key, value){
value.ratio = value.trues / value.count;
return value;
}

db.runCommand({mapReduce:'collection',
map:map,
reduce:reduce,
finalize:finalize,
out:'counts'
})

db.counts.findOne({_id:'alpha'})
{_id: 'alpha', value: {count: 100, trues: 52, ratio: 0.52}}

你也可以做 upsert当你插入到你的主集合中时就像这样,这将使你实时查看你的数据:

for (var key in this.values){
db.counts.update({_id:key},
{$inc:{count:1, trues: (this.values[key] ? 1 : 0)}},
true);
}

事实上,您甚至可以结合使用这些方法。执行一次性 MapReduce 批处理作业来填充计数集合,然后使用 upserts 使其保持最新。

关于php - 有效地计算 MongoDB 中出现的百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4811084/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com