Spring Data Aggregation - first 和 last 的简单组查询不起作用

问题描述 投票:0回答:0

我正在尝试做我认为非常简单的聚合。它在 mongo shell 中工作,但是当我将它转换为 Spring Data Mongo Aggregation API 时,我没有得到任何结果。我正在使用 Mongo 4.4.18 和 Spring Data 3.4.7 (spring-boot-starter-data-mongodb:2.7.8)

数据

这是我拥有的数据的示例快照。

[{
   dateOne: ISODate("2023-03-10T15:10:17Z"),
   dateTwo: ISODate("2023-03-10T16:10:17Z")
},
{
   dateOne: ISODate("2023-03-10T16:10:17Z"),
   dateTwo: ISODate("2023-03-10T15:10:17Z")
}]

聚合

运行以下聚合时我得到了预期的结果:

{ 
    $group: {
        _id: null,
        firstDateOne: { $first: "$dateOne" },
        lastDateOne: { $last: "$dateOne" },
        firstDateTwo: { $first: "$dateTwo" },
        lastDateTwo: { $last: "$dateTwo" },
    }
}

Java 实现

只是为了排除常见问题。我班上的其他功能工作正常。也就是说,

MongoTemplate
已正确配置。这是我添加的新聚合,它不起作用。

这是春天的聚合:

// dateOne and dateTwo are constants, "dateOne", "dateTwo"
Aggregation aggregation = newAggregation(
    group()
        .first(dateOne).as("firstDateOne")
        .last(dateOne).as("lastDateOne")
        .first(dateTwo).as("firstDateTwo")
        .last(dateTwo).as("lastDateTwo"))
return Optional.ofNullable(mongoOperations.aggregate(aggregation, collectionName, CustomDates.class).getUniqueMappedResult())
    .orElseThrow(() -> new IllegalStateException("No dates exists!

这里是 CustomDates 映射类:

@Data
public class CustomDates {

    private Date firstDateOne;
    private Date lastDateOne;
    private Date firstDateTwo;
    private Date lastDateTwo;
}

我没有找到任何结果。我附加了一个调试器并手动运行了

mongoOperations.aggregate()
函数并传入了 Document.class(bson 类),但仍然一无所获。我查看了 spring 构建的聚合管道,将其复制到 mongo 控制台中,聚合工作正常。为了完整起见,这里是调试器的原始聚合值:

{ 
  "aggregate" : "__collection__", 
  "pipeline" : [{ 
     "$group" : { 
         "_id" : null, 
         "firstDateOne" : { "$first" : "$dateOne"}, 
         "lastDateOne" : { "$last" : "$dateOne"}, 
         "firstDateTwo" : { "$first" : "$dateTwo"}, 
         "lastDateTwo" : { "$last" : "$dateTwo"}
     }
  }]
}
java spring mongodb spring-data-mongodb
© www.soinside.com 2019 - 2024. All rights reserved.