当数组是地图的值类型时,Spring Data MongoDB无法引用地图的key属性

时间:2019-04-30 03:58:36

标签: mongodb spring-data aggregation-framework spring-data-mongodb

我正在尝试使用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一起使用

0 个答案:

没有答案