gpt4 book ai didi

java - 如何使用 mongodb 和 NumberLong 计算平均值

转载 作者:IT老高 更新时间:2023-10-28 13:22:17 25 4
gpt4 key购买 nike

我正在尝试使用 mongodb java 驱动程序从集合中计算平均值,如下所示:

DBObject condition = 
new BasicDBObject("pluginIdentifier", plugin.getIdentifier());

DBObject initial = new BasicDBObject();

initial.put("count", 0);
initial.put("totalDuration", 0);
String reduce = "function(duration, out) { out.count++;
out.totalDuration+=duration.floatApprox; }";
String finalize = "function(out) { out.avg = out.totalDuration.floatApprox /
out.count; }";

DBObject avg = durationEntries.group(
new BasicDBObject("pluginIdentifier", true),
condition, initial, reduce, finalize);

System.out.println(avg);

“duration”是一个NumberLong(在java中,它是一个Long,可能是java驱动程序转换的)。经过一番搜索,我发现为了提取数字,使用 .floatApprox 是一种方法,这也适用于 mongodb 控制台:

> db.DurationEntries.findOne().duration.floatApprox
5

但是,运行上面的 java 代码不会计算平均值,而是返回这个值

[{"pluginIdentifier":"dummy", "count":7.0, "totalDuration":NaN, "avg":NaN}]

我尝试了几种变体,使用和不使用 .floatApprox,但到目前为止只能获得一些奇怪的字符串连接。

我的问题是:我做错了什么/我应该如何计算一个 NumberLong 列的平均值?

最佳答案

如果您在使用 map/reduce 时遇到问题,您可能应该进入 mongodb 控制台,在那里解决问题,然后将其转换为您的驱动程序。

以下列文件为例:

db.tasks.find()
{ "_id" : ObjectId("4dd51c0a3f42cc01ab0e6506"), "duration" : 10, "name" : "StartProcess", "date" : "20110501" }
{ "_id" : ObjectId("4dd51c0e3f42cc01ab0e6507"), "duration" : 11, "name" : "StartProcess", "date" : "20110502" }
{ "_id" : ObjectId("4dd51c113f42cc01ab0e6508"), "duration" : 12, "name" : "StartProcess", "date" : "20110503" }

您可以编写 mapReduce 来计算 StartProcess 的平均持续时间,如下所示:

m = function (){
emit( this.name , { totalDuration : this.duration , num : 1 } );
};

r = function (name, values){
var n = {totalDuration : 0, num : 0};
for ( var i=0; i<values.length; i++ ){
n.totalDuration += values[i].totalDuration;
n.num += values[i].num;
}
return n;
};

f = function(who, res){
res.avg = res.totalDuration / res.num;
return res;
};

那么,假设您使用的是 MongoDB 1.7 或更高版本:

db.tasks.mapReduce( m, r, { finalize : f, out : {inline : 1} });

会给你以下答案:

"results" : [
{
"_id" : "StartProcess",
"value" : {
"totalDuration" : 33,
"num" : 3,
"avg" : 11
}
}
]

如果这没有帮助,您能否发布您的 map 功能和文档结构。

关于java - 如何使用 mongodb 和 NumberLong 计算平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4820334/

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