Java 使用Aggrerate从Mongo集合获取平均值

Java 使用Aggrerate从Mongo集合获取平均值,java,mongodb,mongodb-query,aggregation-framework,Java,Mongodb,Mongodb Query,Aggregation Framework,我正在尝试学习如何在Java中使用Mongo,并且能够进行一些简单的查询,但是我在使用聚合运算符时遇到了问题 文档结构很简单,如下所示: { "_id" : ObjectId("57dbe94f0507a4d8710ac5b2"), "name" : "Name1", "age" : 23 } { "_id" : ObjectId("57dbe9750507a4d8710ac5b3"), "name" : "Name2", "age" : "Str

我正在尝试学习如何在Java中使用Mongo,并且能够进行一些简单的查询,但是我在使用聚合运算符时遇到了问题

文档结构很简单,如下所示:

{
    "_id" : ObjectId("57dbe94f0507a4d8710ac5b2"),
    "name" : "Name1",
    "age" : 23
}
{
    "_id" : ObjectId("57dbe9750507a4d8710ac5b3"),
    "name" : "Name2",
    "age" : "String for examble"
}
{
    "_id" : ObjectId("57dbee630507a4d8710ac5b5"),
    "name" : "Name3",
    "age" : 24
}
BasicDBObject groupFields = new BasicDBObject("_id", "null");
BasicDBObject media = new BasicDBObject("$avg", "$age");
groupFields.put("mediaIdade", media);
BasicDBObject group = new BasicDBObject("$group", groupFields );
AggregateIterable<org.bson.Document> agregate = db.getCollection("exemplo").aggregate(Arrays.asList (group));
我所要做的就是得到集合中
年龄的平均值
(名称示例)

简单地使用mongo,我可以通过以下咨询获得理想的结果:

db.example.aggregate([
    {
        $group: {
            _id: null, 
            averageAge: { $avg: "$age" }
        }
    }
]);
我尝试了以下方法:

{
    "_id" : ObjectId("57dbe94f0507a4d8710ac5b2"),
    "name" : "Name1",
    "age" : 23
}
{
    "_id" : ObjectId("57dbe9750507a4d8710ac5b3"),
    "name" : "Name2",
    "age" : "String for examble"
}
{
    "_id" : ObjectId("57dbee630507a4d8710ac5b5"),
    "name" : "Name3",
    "age" : 24
}
BasicDBObject groupFields = new BasicDBObject("_id", "null");
BasicDBObject media = new BasicDBObject("$avg", "$age");
groupFields.put("mediaIdade", media);
BasicDBObject group = new BasicDBObject("$group", groupFields );
AggregateIterable<org.bson.Document> agregate = db.getCollection("exemplo").aggregate(Arrays.asList (group));
basicdbobjectgroupfields=newbasicdbobject(“\u id”,“null”);
BasicDBObject media=新的BasicDBObject($avg),“$age”);
groupFields.put(“mediaIdade”,media);
BasicDBObject group=新的BasicDBObject(“$group”,groupFields);
AggregateItableAgregate=db.getCollection(“Examplo”).aggregate(Arrays.asList(group));
这几乎是一个直接的翻译,但是得到了一个
“java.lang.NoSuchMethodError:org.bson.codecs.BsonTypeClassMap.keys()Ljava/util/Set;”
,毫不奇怪

但我无法将其转换为Java。我已检查并发现,但由于使用了诸如
$unwind
之类的运算器,因此无法理解它。因此,我试图使查询尽可能简单,以便更好地理解Java聚合框架的工作原理


有人能帮忙吗?

我注意到您的代码中有一个小错误:

db.getCollection("exemplo").aggregate(Arrays.asList (group));
应该是
example
而不是
examplo

翻译工作mongo表达式的最简单方法是使用
Document.parse
方法

在您的情况下,可能是:

db.getCollection("exemplo").aggregate(Arrays.asList(
   Document.parse("{ $group: { _id: null, averageAge: { $avg: '$age' } } }")
));
您的impl也几乎正确,有两个小问题:

  • “null”
    字符串替换为仅
    null
  • 使用
    “平均值”
    而不是
    “mediaIdade”


    试试这样的

    MongoCollection<Document> dbCollection = db.getCollection("example", Document.class);
    AggregateIterable<org.bson.Document> aggregate = dbCollection.aggregate(Arrays.asList(Aggregates.group("_id", new BsonField("averageAge", new BsonDocument("$avg", new BsonString("$age"))))));
    Document result = aggregate.first();
    double age = result.getDouble("averageAge");
    
    输出:

    24.333333333333332
    
    试试这个:

    DBObject groupFields = new BasicDBObject( "_id", 0);
    groupFields.put("average", new BasicDBObject( "$avg", "$age"));
    DBObject group = new BasicDBObject("$group", groupFields);
    AggregationOutput output = db.getCollection("exemplo").aggregate(group);
    Iterable<DBObject> list = output.results();
    
    dbobjectgroupfields=newBasicDBObject(“\u id”,0);
    groupFields.put(“average”,新的BasicDBObject($avg),“$age”);
    DBObject group=新的BasicDBObject(“$group”,groupFields);
    AggregationOutput输出=db.getCollection(“Examplo”).aggregate(组);
    Iterable list=output.results();
    
    如果需要,请在查询中添加筛选器,您可以添加匹配参数:

    DBObject match = new BasicDBObject();
    match.put("age", new BasicDBObject("$gte", 25));
    DBObject groupFields = new BasicDBObject( "_id", 0);
    groupFields.put("average", new BasicDBObject( "$avg", "$age"));
    DBObject group = new BasicDBObject("$group", groupFields);
    AggregationOutput output = db.getCollection("exemplo").aggregate(match, group);
    Iterable<DBObject> list = output.results();
    
    DBObject match=new BasicDBObject();
    匹配放置(“年龄”,新基本对象($gte),25));
    DBObject groupFields=新的BasicDBObject(“\u id”,0);
    groupFields.put(“average”,新的BasicDBObject($avg),“$age”);
    DBObject group=新的BasicDBObject(“$group”,groupFields);
    AggregationOutput输出=db.getCollection(“Examplo”).aggregate(匹配,组);
    Iterable list=output.results();
    
    我得到了与原始帖子中相同的异常。将输入和输出添加到帖子中。嘿!我成功了。这都是一个文档类型冲突的问题,因为它们是从两个不同的类导入的。非常感谢你的帮助!聚合函数似乎正在运行,但当我试图获得结果时,它抛出了与原始文章中描述的相同的异常。
    DBObject match = new BasicDBObject();
    match.put("age", new BasicDBObject("$gte", 25));
    DBObject groupFields = new BasicDBObject( "_id", 0);
    groupFields.put("average", new BasicDBObject( "$avg", "$age"));
    DBObject group = new BasicDBObject("$group", groupFields);
    AggregationOutput output = db.getCollection("exemplo").aggregate(match, group);
    Iterable<DBObject> list = output.results();