Java 使用Aggrerate从Mongo集合获取平均值
我正在尝试学习如何在Java中使用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
{
"_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();