java聚合不一致地输出不同的值

mfuanj7w  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(285)

我有以下代码片段,应该使用spring数据mongodb检索帐户的总数

TypedAggregation<Account> agg = Aggregation.newAggregation(Account.class,
        group("user.id"),
        group().count().as("total"));

AggregationResults<AccountTotal> result = mongos.aggregate(agg, AccountTotal.class);
AccountTotal account = result.getMappedResults().get(0);
account.getTotal(); // should print 90 but prints 1

这里是从agg字段返回的等价mongo脚本,我在mongo shell中使用它

{ "$group" : { "_id" : "$user.id"}} , 
{ "$group" : { "_id" :  null  , "total" : { "$sum" : 1}}}
> db.accounts.aggregate(
[
{ "$group" : { "_id" : "$user.id"}} , 
{ "$group" : { "_id" :  null  , "total" : { "$sum" : 1}}}
])

在java平台上,我缺少的是1。
编辑:将上一个更改为下一个后,我得到预期的计数:

Aggregation agg = Aggregation.newAggregation( 
                   group("user.id"), 
                   group().count().as("total")); 
AggregationResults<AccountTotal> result = 
mongos.aggregate(agg, this.getCollectionName(), AccountTotal.class);

顺便说一句,谢谢@chridam。

hsvhsicv

hsvhsicv1#

之所以得到1,是因为当前的聚合管道返回所有90个按分组的文档 user.id 在一个数组中,每个数组可能总共有1(我猜)。这条线 result.getMappedResults().get(0) 将获取聚合结果中的第一个元素,该元素的总数为1。您尝试获取的总数是所有分组文档的总和,即聚合结果游标数组的长度。
我相信你想把所有的文件按 $user.id 字段中,获取每个分组结果的计数,然后执行另一个 $group 获取所有组计数之和的操作:

> db.accounts.aggregate(
[
    { "$group" : { "_id" : "$user.id", "count" : { "$sum" : 1 } } },
    { "$group" : { "_id" : null, "total" : { "$sum" : "$count" } } }
])

这会给你想要的结果。Spring聚合当量

TypedAggregation<Account> agg = Aggregation.newAggregation(Account.class,
      group("user.id").count().as("count"),  
      group().sum("count").as("total"));

AggregationResults<AccountTotal> result = mongos.aggregate(agg, AccountTotal.class);
List<AccountTotal> accountCount = result.getMappedResults();
(accountCount.get(0).total == 90); // should be true

相关问题