Spring Data MongoDB не может ссылаться на свойство ключа карты, когда массив является типом значения карты - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь использовать поддержку Spring Data MongoDB Aggregation Framework для фильтрации массивов на основе указанных условий, но я могу получить только исключение:

org.springframework.data.mapping.PropertyReferenceException: нетсвойство 10 найдено по типу List!Пройденный путь: StudyRecord.channelRecords.

Полагаю, проблема усложняется тем, что эти массивы являются типом значений в карте, ключ которой является идентификатором какой-то другой таблицы.

Структура документа 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;

}

Чтобы продемонстрировать, что агрегация работает в монго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

...