gpt4 book ai didi

java - mongo + spring 数据 + 总和

转载 作者:可可西里 更新时间:2023-11-01 09:51:02 25 4
gpt4 key购买 nike

我正在寻找没有 Spring 数据的解决方案。我的项目要求是不使用 spring 数据。

通过mongo命令使用聚合函数计算总和,能够得到输出。但同样通过使用 spring 数据获取异常。示例 mongo 查询:

db.getCollection('events_collection').aggregate(
{ "$match" : { "store_no" : 3201 , "event_id" : 882800} },
{ "$group" : { "_id" : "$load_dt", "event_id": { "$first" : "$event_id" }, "start_dt" : { "$first" : "$start_dt" }, "count" : { "$sum" : 1 } } },
{ "$sort" : { "_id" : 1 } },
{ "$project" : { "load_dt" : "$_id", "ksn_cnt" : "$count", "event_id" : 1, "start_dt" : 1, "_id" : 0 } }
)

同样的事情在 java 中完成,

String json = "[ { \"$match\": { \"store_no\": 3201, \"event_id\": 882800 } }, { \"$group\": { \"_id\": \"$load_dt\", \"event_id\": { \"$first\": \"$event_id\" }, \"start_dt\": { \"$first\": \"$start_dt\" }, \"count\": { \"$sum\": 1 } } }, { \"$sort\": { \"_id\": 1 } }, { \"$project\": { \"load_dt\": \"$_id\", \"ksn_cnt\": \"$count\", \"event_id\": 1, \"start_dt\": 1, \"_id\": 0 } } ]";

BasicDBList pipeline = (BasicDBList) JSON.parse(json);

System.out.println(pipeline);

AggregationOutput output = col.aggregate(pipeline);

异常(exception)是:

com.mongodb.CommandFailureException: { "serverUsed" : "somrandomserver/10.10.10.10:27001" , "errmsg" : "exception: pipeline element 0 is not an object" , "code" : 15942 , "ok" : 0.0}

有人可以建议如何在 spring 中使用聚合函数吗?

最佳答案

尝试以下(未经测试) Spring Data MongoDB aggregation 等效

import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;

MongoTemplate mongoTemplate = repository.getMongoTemplate();
Aggregation agg = newAggregation(
match(Criteria.where("store_no").is(3201).and("event_id").is(882800)),
group("load_dt")
.first("event_id").as("event_id")
.first("start_dt").as("start_dt")
.count().as("ksn_cnt"),
sort(ASC, previousOperation()),
project("ksn_cnt", "event_id", "start_dt")
.and("load_dt").previousOperation()
.and(previousOperation()).exclude()
);

AggregationResults<OutputType> result = mongoTemplate.aggregate(agg,
"events_collection", OutputType.class);
List<OutputType> mappedResult = result.getMappedResults();

第一步,使用接受条件查询作为参数的匹配操作来过滤输入集合。

第二步,将中间过滤后的文档按"load_dt"字段进行分组,计算文档计数,将结果存入新字段"ksn_cnt"

根据 previousOperation() 方法给出的前一组操作的 id 引用对中间结果进行排序。

最后在第四步,选择上次分组操作的"ksn_cnt""event_id""start_dt"字段.请注意,"load_dt" 再次隐式引用了一个 group-id 字段。由于您不希望出现隐式生成的 id,因此通过 and(previousOperation()).exclude() 从之前的操作中排除该 id。

请注意,如果您提供输入类作为 newAggregation 方法的第一个参数,MongoTemplate 将派生输入集合的名称从这个类。否则,如果您不指定输入类,则必须明确提供输入集合的名称。如果提供了输入类和输入集合,则后者优先。

关于java - mongo + spring 数据 + 总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33100026/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com