我正在尝试做我认为非常简单的聚合。它在 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" },
}
}
只是为了排除常见问题。我班上的其他功能工作正常。也就是说,
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"}
}
}]
}