【问题标题】:Spring data mongo: Projection not working when path includes a key of a HashMapSpring data mongodb:当路径包含HashMap的键时,投影不起作用
【发布时间】:2020-03-21 09:40:52
【问题描述】:

问题

当我尝试投射 java.util.Map 内的值时,我得到以下异常。但是当我在 roboMongo 中运行生成的 shell 查询时,它就可以工作了。如果有人能指出问题,我将不胜感激。

org.springframework.data.mapping.context.InvalidPersistentPropertyPath: No property Germany found on com.nntn.corona.snapshot.repo.model.StatWithDelta!

Java 中的查询代码

spring boot 父级: 2.0.5.RELEASE

Criteria matchCriteria = Criteria.where("timestamp").gte(startDate);
        MatchOperation match = Aggregation.match(matchCriteria);
        SortOperation sort = sort(new Sort(Sort.Direction.ASC, "timestamp"));

        // @formatter:off
        ProjectionOperation projection = project()
                .andExpression("timestamp").as("timestamp")
                .andExpression("countries.germany.total").as("total")
                .andExpression("countries.germany.today").as("today");
        // @formatter:on

        Aggregation aggregation = newAggregation(match, sort,projection);

        AggregationResults<Document> result = mongoTemplate.aggregate(aggregation, SnapshotEntry.class,
                Document.class);
        return result.getMappedResults();

数据模型

Java 表示

@Document(collection = "snpashots")
public class SnapshotEntry {

    @Id
    private String id;

    @Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
    @Temporal(TemporalType.TIMESTAMP)
    private DateTime timestamp;

    private Map<String, StatWithDelta> countries;
    private StatEntity total;
    private StatEntity today;
    private String source;
    private String previousRecordId;

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class StatWithDelta {
        private StatEntity total;
        private StatEntity today;
    }

}

Json 表示

{
    "_id" : "21-03-2020",
    "timestamp" : ISODate("2020-03-21T09:26:00.965Z"),
    "countries" : {
        "germany" : {
            "total" : {
                "born" : NumberLong(81008),
                "dead" : NumberLong(3255),
                "sick" : NumberLong(30000)
            },
            "today" : {
                "born" : NumberLong(50),
                "dead" : NumberLong(10),
                "sick" : NumberLong(12)
            }
        }
    },
    "_class" : "com.nntn.snapshot.repo.model.SnapshotEntry"
}

【问题讨论】:

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


    【解决方案1】:

    问题出在TypedAggregation。这是一个特殊的聚合,其中 Spring 保存输入聚合类型的信息。

    为避免这种情况,请以这种方式使用原始聚合(就像在 MongoDB shell 中运行一样):

    AggregationResults<SnapshotEntry> result = mongoTemplate.aggregate(aggregation, 
                mongoTemplate.getCollectionName(SnapshotEntry.class),
                SnapshotEntry.class);
    

    【讨论】:

    • 非常感谢@Valijon。这解决了这个问题。 :)
    猜你喜欢
    • 2011-12-16
    • 2021-03-22
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2019-07-14
    相关资源
    最近更新 更多