当前位置: 首页 > 知识库问答 >
问题:

从MongoDB到Spring Boot聚合框架的聚合

空英达
2023-03-14

我不熟悉Spring和Mongo。我正在使用Spring Batch获取一些报告。我的查询需要一些MongoItemReader不支持的聚合,所以我根据下面的stackoverflow链接扩展了该类。

如何在Spring批处理中使用MongoItemReader聚合查询

但我的聚合有点问题。我制作的聚合在mongoDB中运行良好,但无法将其转换为Spring mongo聚合。

MongoDb聚合按预期工作。

db.getCollection('orders').aggregate([
  {$match: {orderDate: {$gt:"2021-03-15",$lt: "2021-03-17"}, "status" :{"$in": ["GREEN", "YELLOW"]}}},
  {$group: {_id: {orderDate: "$orderDate", node: "$node", code1:"$code1", code2:"$code2"}, orderUnts: {$sum: 1}}},
  {"$project": {orderDate:"$_id.orderDate", node:"$_id.node", code1:"$_id.code1", code2:"$_id.code2", orderUnts:"$orderUnts"}}
])

Spring蒙戈聚合给出错误。

String[] fields = {"orderDate", "node", "code1", "code2"};
String[] projectionFields = {"orderDate", "orderDate", "code1", "code2"};
MatchOperation matchOp = Aggregation.match(Criteria.where("orderDate").gt(startDate).and("orderDate").lt(endDate).and("status").in("GREEN", "YELLOW"));
GroupOperation groupOp = Aggregation.group(fields).sum("orderUnts").as("_id");
ProjectionOperation projectOp = Aggregation.project(projectionFields);
SortOperation sortOp = Aggregation.sort(Sort.by(Sort.Direction.ASC, "orderDate"));
Aggregation aggregation = Aggregation.newAggregation(matchOp, groupOp, projectOp, sortOp);

我得到下面唯一的字段错误。

Caused by: java.lang.IllegalStateException: An implementation of MongoOperations is required.
at org.springframework.util.Assert.state(Assert.java:76)
at org.springframework.batch.item.data.MongoItemReader.afterPropertiesSet(MongoItemReader.java:238)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1847)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1784)
... 81 common frames omitted

MongoItemReader扩展类。

@Data
public class CustomMongoItemReader<T> extends MongoItemReader<T> {

    private MongoTemplate template;
    private Class<? extends T> type;
    private String collection;
    private MatchOperation matchOperation;
    private GroupOperation groupOperation;
    private ProjectionOperation projectionOperation;
    private SortOperation sortOperation;
    private Aggregation aggregation;

    @Override
    protected Iterator<T> doPageRead() {
        Pageable page = PageRequest.of(this.page, this.pageSize);
        if(matchOperation != null && groupOperation != null) {
            Aggregation agg = Aggregation.newAggregation(matchOperation,
                    groupOperation,
                    projectionOperation,
                    sortOperation,
                    Aggregation.skip(Long.valueOf(page.getPageNumber() * page.getPageSize())),
                    Aggregation.limit(page.getPageSize())
            );
            return (Iterator<T>) template.aggregate(agg, collection, this.type).iterator();
        }
        else {
            return Collections.emptyIterator();
        }
    }
}

如果问题需要更多信息,请告诉我。提前谢谢。

共有1个答案

钮轩昂
2023-03-14

JAVAlang.IllegalStateException:需要实现MongoOperations。

您的条目阅读器扩展了MongoItemReader,这需要MongoOperations(通常是MongoTemplate)。此错误意味着您的项目阅读器未配置MongoOperations

在使用之前,您需要在阅读器上设置一个。

 类似资料:
  • 是否可以在$match中执行OR? 我的意思是这样的:

  • MongoDB中的聚合框架有解释功能吗?我在文件里看不到。 我知道找到你就行了 但是在聚合框架中,我得到了一个错误

  • 我正在评估MongoDB聚合框架在多大程度上适合我们的需求,因为我们目前运行在SQL Server之上。我很难执行特定的查询: 假设我有以下伪记录(建模为sql表中的列和mongodb集合中的完整文档) 我很难在mongodb聚合框架中找到合适的结构来执行这样的查询。我可以通过在管道中插入$match来查询单个范围的结果(即获取单个范围的结果),但我无法在单个管道查询中提取所有范围及其计数。

  • 有人能帮我把这个mongoDB聚合转换成Spring数据mongo吗? 我试图在每个邀请函文件中获得未提醒与会者的电子邮件列表。 让它在mongo shell中运行,但需要在Spring data mongo中运行。 我的shell查询 ) 正如你们所看到的,这是我提出的,它在管道的项目和团队运作中并没有像预期的那样发挥作用。下面给出了生成的查询。 聚合对象创建 它创建以下查询 聚合对象生成的查询

  • 本文向大家介绍MongoDB的聚合框架Aggregation Framework入门学习教程,包括了MongoDB的聚合框架Aggregation Framework入门学习教程的使用技巧和注意事项,需要的朋友参考一下 1. 聚合框架 使用聚合框架对集合中的文档进行变换和组合,可以用多个构件创建一个管道(pipeline),用于对一连串的文档进行处理。这些构件包括筛选(filtering),投射(

  • 我有一个包含联系人的集合,每个联系人文档都有和属性。 现在我想使用Java和版本3.2中的MongoDb Java驱动程序查询数据库。 谢谢。