1

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

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

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

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

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

[{“action”:“AWARD”,“amount”:9000,“notes”:“初始余额”,“用户名”:“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 注释来做到这一点?

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

4

1 回答 1

2

嗯,我认为@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)

我希望它对你有帮助:)

于 2015-05-07T05:39:52.700 回答