首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Accumulators.Push中的Mongo DB Accumulators.sum

Accumulators.Push中的Mongo DB Accumulators.sum
EN

Stack Overflow用户
提问于 2019-07-31 03:11:16
回答 1查看 830关注 0票数 0

对于初学者来说,我是第一次接触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时我的列表的内容

代码语言:javascript
复制
[{{"$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文档包含以下内容,这正是我想要的。我有两个按站点分组的结果,每个作者在该站点的计数

代码语言:javascript
复制
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}}]}}

我相信我已经使用以下代码对文档进行了第一次分组和排序。

代码语言:javascript
复制
bsonList.add(Aggregates.group(d, Accumulators.sum("aggCount", 1)));
bsonList.add(Aggregates.sort(Sorts.ascending("aggCount")));

它会生成

代码语言:javascript
复制
[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}}]

我想我被困在推力上了。我目前有以下内容

代码语言:javascript
复制
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)));

包括第一个组和排序的上述内容

代码语言:javascript
复制
[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类的编解码器错误。

代码语言:javascript
复制
count=BsonField{name='aggCount', value=Expression{name='$sum', expression=1}}

因此,总的来说,我正在尝试弄清楚如何在推送中做accumulation.sum。

EN

回答 1

Stack Overflow用户

发布于 2019-07-31 11:21:59

您可以通过以下方式完成此操作:

代码语言:javascript
复制
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' } }"))));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57278574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档