对于初学者来说,我是第一次接触Mongo DB。我遵循了一些指南和示例,例如https://www.programcreek.com/java-api-examples/index.php?api=com.mongodb.client.model.Aggregates上的指南和示例
和http://zetcode.com/db/mongodbjava/
我得出的结论是,有两种与数据库交互的方式。一个使用org.bson.Document,另一个使用com.mongodb.BasicDBObject;
我已经用BasicDBObject解决了我的问题,但是它看起来并不干净,逻辑也变得更加复杂。
我在这里寻找的是如何将我使用BasicDBObjects的内容转换为使用文档的内容。
以下是使用BasicDBObjects时我的列表的内容
[{{"$group": {"_id": {"site": "$site", "author": "$author"}, "AggCount": {"$sum": 1}}},
{"$sort": {"AggCount": -1}},
{"$group": {"_id": "$_id.site", "aggResults": {"$push": {"author": "$_id.author", "count": {"$sum": "$AggCount"}}}}}}]当我在我的集合上执行聚合函数时,我的AggregateIterable文档包含以下内容,这正是我想要的。我有两个按站点分组的结果,每个作者在该站点的计数
Document{{_id=Dayton, aggResults=[Document{{author=jthomas, count=7}}, Document{{author=mculb, count=7}}, Document{{author=rjohn, count=4}}]}}
Document{{_id=Charleston, aggResults=[Document{{author=jree, count=9}}, Document{{author=cschm, count=6}}]}}我相信我已经使用以下代码对文档进行了第一次分组和排序。
bsonList.add(Aggregates.group(d, Accumulators.sum("aggCount", 1)));
bsonList.add(Aggregates.sort(Sorts.ascending("aggCount")));它会生成
[Stage{name='$group', id=Document{{site=$site, author=$author}}, fieldAccumulators=[BsonField{name='aggCount', value=Expression{name='$sum', expression=1}}]}, Stage{name='$sort', value={"aggCount": 1}}]我想我被困在推力上了。我目前有以下内容
for (String p : subAggFields) {
subDoc.append(p, "$_id." + p);
}
subDoc.append("count", Accumulators.sum("aggCount", 1));
bsonList.add(Aggregates.group(mainDoc, Accumulators.push("aggResults", subDoc)));包括第一个组和排序的上述内容
[Stage{name='$group', id=Document{{site=$site, author=$author}}, fieldAccumulators=[BsonField{name='aggCount', value=Expression{name='$sum', expression=1}}]},
Stage{name='$sort', value={"aggCount": 1}},
Stage{name='$group', id=Document{{_id=$site}}, fieldAccumulators=[BsonField{name='aggResults', value=Expression{name='$push', expression=Document{{author=$_id.author, count=BsonField{name='aggCount', value=Expression{name='$sum', expression=1}}}}}}]}]我还知道问题出在下面的代码中,因为我得到了一个org.bson.codecs.configuration.CodecConfigurationException:找不到com.mongodb.client.model.BsonField类的编解码器错误。
count=BsonField{name='aggCount', value=Expression{name='$sum', expression=1}}因此,总的来说,我正在尝试弄清楚如何在推送中做accumulation.sum。
发布于 2019-07-31 11:21:59
您可以通过以下方式完成此操作:
List<Bson> aggregates = Arrays.asList(
Aggregates.group(Document.parse("{ 'site': '$site', 'author': '$author' }"),
Accumulators.sum("AggCount", 1)),
Aggregates.sort(Sorts.descending("AggCount")),
Aggregates.group("$_id.site", Accumulators.push("aggResults", Document
.parse("{ 'author': '$_id.author', 'count': { '$sum': '$AggCount' } }"))));https://stackoverflow.com/questions/57278574
复制相似问题