我正在尝试使用Spring Data MongoDB Aggregation Framework Support根据指定条件过滤阵列,但是我只能得到异常:
org.springframework.data.mapping.PropertyReferenceException:找不到类型为List的属性10!遍历的路径:StudyRecord.channelRecords。
我想使问题复杂化的是,那些数组是键为其他表的ID的映射中的值类型。
MongoDB文档结构如下:
{
"_id" : "dJ_o8070Sq2f8JqhYBZSjqDhP7Wk",
"channelRecords" : {
"10" : [
{
"startTime" : ISODate("2019-04-24T01:31:27.302Z"),
"endTime" : ISODate("2019-04-24T02:36:27.302Z"),
"_class" : "StudyRecordSingleDay"
},
{
"startTime" : ISODate("2019-04-25T03:01:28.198Z"),
"endTime" : ISODate("2019-04-25T04:01:28.198Z"),
"_class" : "StudyRecordSingleDay"
}
],
"11" : [
{
"startTime" : ISODate("2019-04-23T03:01:28.198Z"),
"endTime" : ISODate("2019-04-23T04:01:28.198Z"),
"_class" : "StudyRecordSingleDay"
}
]
}
}
对应的POJO类是(省略了类注释)
public class StudyRecord {
@Id
private String someId;
private Map<Integer, List<StudyRecordSingleDay>> channelRecords;
}
在这里展示聚合可以在mongo shell中工作
db.studyRecord.aggregate([
{ $project: {
"channelRecords.10": {
$filter: {
input: "$channelRecords.10",
as: "record",
cond: {$gte: ["$$record.studyTime", ISODate("2019-04-01T23:14:19.000Z")]}
}
}
} }
]);
ProjectionOperation的构造如下
project("_id")
.and(ArrayOperators.arrayOf("$channelRecords.10")
.filter().as("record").by(
new Document(
"$gte",
Arrays.asList("$$record.startTime", LocalDateTime.parse("2019-04-24T01:31:27"))
)
))
.as("channelRecords.10")
我既没有在Spring Data MongoDB参考文档中也没有在分类的官方测试中找到特定的示例代码。
我调试了一些代码,发现问题似乎是由数组路径引用ArrayOperators.arrayOf(“ $ channelRecords.10” )引起的。 Spring Data MongoDB似乎将10作为channelRecords映射的值类型的属性,即List。因此,引发了异常No property 10 found for type List
有人能阐明我的问题吗?谢谢!
版本: spring-boot-starter-data-mongodb与Spring Boot Starter Parent 2.1.4.RELEASE一起使用