我有以下代码片段,应该使用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。
1条答案
按热度按时间hsvhsicv1#
之所以得到1,是因为当前的聚合管道返回所有90个按分组的文档
user.id
在一个数组中,每个数组可能总共有1(我猜)。这条线result.getMappedResults().get(0)
将获取聚合结果中的第一个元素,该元素的总数为1。您尝试获取的总数是所有分组文档的总和,即聚合结果游标数组的长度。我相信你想把所有的文件按
$user.id
字段中,获取每个分组结果的计数,然后执行另一个$group
获取所有组计数之和的操作:这会给你想要的结果。Spring聚合当量