我有一个名为Buffer的集合,其中的文档如下:
{ "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());
}
结果是: {“ averageOfTop”:51.25,“ averageOfSide”:75.125}
Java驱动程序的MongoDB文档指出:
“对于$group
累加器表达式,Java驱动程序提供了Accumulators帮助器类。对于其他聚合表达式,请手动构建表达式Document。”
但是我不知道如何使用Projection.compute()
来构建
{avgOfBackAndForth:{$avg:["$avgOfFront","$avgOfBehind"]}
任何帮助,将不胜感激。
谢谢。