gpt4 book ai didi

java - Accumulators.Push 内的 Mongodb Accumulators.sum

转载 作者:行者123 更新时间:2023-12-02 09:38:43 27 4
gpt4 key购买 nike

首先,我是 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 的内容转换为使用 Document 的内容。

下面是我使用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: Can't find a codec for class com.mongodb.client.model.BsonField 错误。

count=BsonField{name='aggCount', value=Expression{name='$sum', expression=1}}

所以总的来说,我试图弄清楚如何在推送中进行累积。

最佳答案

您可以通过以下方式执行此操作:

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' } }"))));

关于java - Accumulators.Push 内的 Mongodb Accumulators.sum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57278574/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com