如何使用$平均;使用mongodb java驱动程序在投影阶段聚合表达式
我有一个名为Buffer的集合,其中的文档如下所示:如何使用$平均;使用mongodb java驱动程序在投影阶段聚合表达式,java,mongodb,Java,Mongodb,我有一个名为Buffer的集合,其中的文档如下所示: { "load" : { "metric" : { "behind" : 35, "side" : 15, "top" : 135, "front" : 0 } } } { "load" : { "metric" : { "behind" : 35, "
{ "load" : { "metric" : { "behind" : 35, "side" : 15, "top" : 135, "front" : 0 } } }
{ "load" : { "metric" : { "behind" : 35, "side" : 76, "top" : 120, "front" : 13 } } }
{ "load" : { "metric" : { "behind" : 47, "side" : 122, "top" : 0, "front" : 25 } } }
{ "load" : { "metric" : { "behind" : 67, "side" : 88, "top" : 11, "front" : 38 } } }
{ "load" : { "metric" : { "behind" : 100, "side" : 9, "top" : 42, "front" : 41 } } }
{ "load" : { "metric" : { "behind" : 119, "side" : 56, "top" : 12, "front" : 59 } } }
{ "load" : { "metric" : { "behind" : 131, "side" : 90, "top" : 34, "front" : 62 } } }
{ "load" : { "metric" : { "behind" : 165, "side" : 145, "top" : 56, "front" : 176 } } }
我想使用聚合并计算边值和顶值的平均值。
我还想一起计算前后值的平均值,我的意思是计算前后值之和,然后根据这两个字段的平均值来计算。
我在mongo shell里找到了这个
命令如下:
db.Buffer.aggregate([
{
$group: {
_id: null,
avgOfTop: { $avg: "$load.metric.top" },
avgOfFront: { $sum: "$load.metric.front" },
avgOfBehind: { $sum: "$load.metric.behind" },
avgOfSide: { $avg: "$load.metric.side" },
},
},
{ $project: { avgOfBackAndForth: { $avg: ["$avgOfFront", "$avgOfBehind"] }, avgOfTop: 1, avgOfSide: 1, _id: 0 } },
]);
结果是:
{ "avgOfTop" : 51.25, "avgOfSide" : 75.125, "avgOfBackAndForth" : 556.5 }
但我不知道如何在java的投影阶段实现avg表达式
我的java代码:
MongoCollection<Document> collection =MongoConnectionManager.getInstance().getMongoCollection();
final List<BsonField> bsonFieldList = new ArrayList<>();
bsonFieldList.add(avg("averageOfTop","$load.metric.top"));
bsonFieldList.add(avg("averageOfSide","$load.metric.side"));
bsonFieldList.add(sum("sumOfFront","$load.metric.front"));
bsonFieldList.add(sum("sumOfBehind","$load.metric.behind"));
Bson match = match(gte(ConstantStrings.ID_KEY,0));
Bson group = group(null,bsonFieldList);
Bson project = project(fields(excludeId(),
include(ConstantStrings.AVERAGE_OF_TOP_METRICS,ConstantStrings.AVERAGE_OF_SIDE_METRICS)
// computed(ConstantStrings.AVERAGE_OF_BACK_AND_FORTH_METRICS,query)
));
AggregateIterable<Document> rs = collection.aggregate(Arrays.asList(match,group,project));
for (Document dbObject : rs)
{
System.out.println(dbObject.toJson());
}
MongoCollection collection=MongoConnectionManager.getInstance().getMongoCollection();
最终列表bsonFieldList=新的ArrayList();
添加(avg(“averageOfTop”,“$load.metric.top”);
添加(平均(“averageOfSide”,“$load.metric.side”);
添加(总和(“sumOfFront”,“$load.metric.front”);
添加(总和(“sumOfBehind”,“$load.metric.behind”);
Bson match=match(gte(ConstantStrings.ID_键,0));
Bson group=group(空,bsonFieldList);
Bson project=project(字段(excludeId(),
包括(ConstantStrings.AVERAGE_OF_TOP_度量、ConstantStrings.AVERAGE_OF_SIDE_度量)
//计算(常量字符串。前后度量的平均值,查询)
));
AggregateIterable rs=collection.aggregate(Arrays.asList(匹配、组、项目));
for(文档dbObject:rs)
{
System.out.println(dbObject.toJson());
}
结果是:
{“averageOfTop”:51.25,“averageOfSide”:75.125}
MongoDB java驱动程序文档声明:
对于$group
累加器表达式,Java驱动程序提供累加器帮助类。对于其他聚合表达式,请手动生成表达式文档
但是我不知道如何使用Projection.compute()
来构建
{avgOfBackAndForth:{$avg:[“$avgOfFront”,“$avgOfBehind”]}
任何帮助都将不胜感激。
谢谢