如何在mongodb java驱动程序的投影阶段使用“ $ avg”聚合表达式

时间:2020-09-19 16:48:15

标签: java mongodb

我有一个名为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"]} 任何帮助,将不胜感激。 谢谢。

0 个答案:

没有答案