Я пытаюсь использовать поддержку 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