【问题标题】:Is there a way to use @Query to return a MongoDB $sum result?有没有办法使用 @Query 返回 MongoDB $sum 结果?
【发布时间】:2015-07-17 09:36:30
【问题描述】:

我对 MongoDB 和 StackOverflow 都很陌生(作为提问者)。对于如何使用 @Query 注释 (Count in Spring data mongodb repository) 从 Spring 存储库返回 MongoDB“计数”投影,我看到了很好的响应。

基本上计数示例如下所示: @Query(value = "{'productDetails.productType': {$regex: ?0, $options: 'i'}, 'sourceDescriptor': ?1}", count = true)

...并且该方法返回一个int。我想做类似的事情,但我返回的 int 是一个总和而不是一个计数。 @Query 注解看起来不像是为支持 sum() 操作而构建的,但这正是我所需要的。

我担心自己被水洗了,我必须遍历一组文档才能得到我需要的结果。

我有一系列交易(例如借记和贷记、正数和负数)。这是交易数据的模拟:

[{ "action" : "AWARD", "amount" : 9000, "notes" : "初始余额", "username" : "aa" }, { "action" : "PAYOUT", "amount" : 1800, "notes" : "Earnings", "username" : "aa" }, { "action" : "WITHDRAWAL", "amount" : -5000, "notes" : "直接存款 /r#e#d#a#c#t#e#d/", "username" : "aa" } , { "action" : "AWARD", "amount" : 7000, "notes" : "初始余额", "username" : "bb" }]

我想使用存储库获取给定用户名的各种交易的净值(总和)。如果可能的话,我宁愿不返回所有 Mongo 文档的列表并遍历它们以获得总和。

有没有办法使用@Query 注解来做到这一点?

这是我的第一个问题。如果我偏离了目标,请原谅我。

【问题讨论】:

  • 我希望尽可能提供帮助......这就是我试图在 Spring 存储库中复制的内容:db.accountTxns.aggregate([{$match:{username:'aa'} }, {$group:{_id:'$username', total: {$sum:'$amount'}}}])

标签: spring mongodb aggregation-framework spring-mongodb


【解决方案1】:

嗯,我认为@Query 注释无法完成 mongo 聚合(如果我没记错的话,查询和聚合是不同类型的操作):(

您可能必须创建自定义方法并使用 Spring 附带的 Fluent Interfaces 来实现它,例如,如果您想要 $sum,聚合将如下所示:

TypedAggregation<YourClass.class> agg = newAggregation(YourClass.class,
   group("username").sum("amount").as("totalAmount"),
   project("totalAmount"));

AggregationResults<YourResultClassContainingOnlyTotalAmount> result =
   mongoTemplate.aggregate(agg, YourResultClassContainingOnlyTotalAmount.class)

希望对你有帮助:)

【讨论】:

  • 谢谢费尔南多...因为这是我的第一篇文章,我还不能为你的答案提供投票。尽管我已经找到了为代码库的其他区域创建 Spring CustomRepository 的理由,但我希望使用一个直接的存储库来做到这一点。
  • 没问题 :-) 我很乐意分享一些诀窍
猜你喜欢
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
  • 2015-07-19
  • 2017-11-29
  • 1970-01-01
  • 2013-07-22
  • 2016-02-25
相关资源
最近更新 更多