MongoDb聚合查询转换为Spring-data

3

我有一个聚合函数,该函数的输出结构如下:

 {
    "_id" : {
        "vehicleNumber" : "HR55W8395",
        "vehicleType" : "TYPE_32"
    },
    "mileage" : [
        3.4200838876537736,
        3.6082731400212595,
        3.7118590539249254,
        2.9805899622661784,
        5.227747018794297,
        3.222515049264743,
        3.8845896154778603,
        3.548054585322907,
        3.010341324091653
    ]
}

聚合函数是指对多个数据进行计算并返回单个值的函数。
db.hop.aggregate([{$group : {_id : {vehicleNumber : "$vehicleNumber", vehicleType : "$vehicleType"}, mileage: {$push : "$mileage"}}}])

而在Spring中编写的聚合是:

AggregationOperation match = match(Criteria.where("startHubOutTime").gte(startDateTime).and("endHubInTime").lte(endDateTime).and("vehicleNumber").exists(true).and("mileage").exists(true));
        //GroupOperationBuilder group = Aggregation.group("vehicleNumber","vehicleType").push("mileage");
        AggregationOperation grAggregationOperation =Aggregation.group("vehicleNumber","vehicleType").push(new BasicDBObject("mileage","$mileage")).as("mileage"); ;//group.as("_id");
        AggregationOperation project = Aggregation.project("mileage").andInclude("vehicleNumber","vehicleType");
        Aggregation newAggregation = Aggregation.newAggregation(match, grAggregationOperation);
        AggregationResults<AggregatedMileageOutput> aggregatedMileageOutputs = mongoTemplate.aggregate(newAggregation, Hop.class, AggregatedMileageOutput.class);

输出结果为:聚合里程输出

class AggregatedMileageOutput {
    private String vehicleNumber;
    private VehicleType vehicleType;
    private ArrayList<Double> mileage;
}

但是在聚合操作期间,我遇到了一个错误:
Request processing failed; nested exception is org.springframework.data.mapping.model.MappingException: No mapping metadata found for java.lang.Double

Stack trace : 
org.springframework.data.mapping.model.MappingException: No mapping metadata found for java.lang.Double
    org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:228)
    org.springframework.data.mongodb.core.convert.MappingMongoConverter.readCollectionOrArray(MappingMongoConverter.java:906)
    org.springframework.data.mongodb.core.convert.MappingMongoConverter.readValue(MappingMongoConverter.java:1183)
    org.springframework.data.mongodb.core.convert.MappingMongoConverter.access$200(MappingMongoConverter.java:78)
    org.springframework.data.mongodb.core.convert.MappingMongoConverter$MongoDbPropertyValueProvider.getPropertyValue(MappingMongoConverter.java:1133)
    org.springframework.data.mongodb.core.convert.MappingMongoConverter.getValueInternal(MappingMongoConverter.java:869)
    org.springframework.data.mongodb.core.convert.MappingMongoConverter$1.doWithPersistentProperty(MappingMongoConverter.java:282)
    org.springframework.data.mongodb.core.convert.MappingMongoConverter$1.doWithPersistentProperty(MappingMongoConverter.java:270)
    org.springframework.data.mapping.model.BasicPersistentEntity.doWithProperties(BasicPersistentEntity.java:309)
    org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:270)
    org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:231)
    org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:191)
    org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:187)
    org.springframework.data.mongodb.core.convert.MappingMongoConverter.read(MappingMongoConverter.java:78)
    org.springframework.data.mongodb.core.MongoTemplate$ReadDbObjectCallback.doWith(MongoTemplate.java:2215)
    org.springframework.data.mongodb.core.MongoTemplate$UnwrapAndReadDbObjectCallback.doWith(MongoTemplate.java:2248)
    org.springframework.data.mongodb.core.MongoTemplate.returnPotentiallyMappedResults(MongoTemplate.java:1533)
    org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:1509)
    org.springframework.data.mongodb.core.MongoTemplate.aggregate(MongoTemplate.java:1435)

请帮忙解决这个问题。

1个回答

1
错误提示你管道中的一个变量名与 mongodb 集合中字段的名称不同(拼写,大小写)。尝试将聚合操作重写为:
Aggregation agg = newAggregation(
    match(
        Criteria.where("startHubOutTime").gte(startDateTime)
            .and("endHubInTime").lte(endDateTime)
            .and("vehicleNumber").exists(true)
            .and("mileage").exists(true)
    ),
    group("vehicleNumber", "vehicleType").push("mileage").as("mileage") 
);

AggregationResults<AggregatedMileageOutput> results = mongoTemplate.aggregate(agg,  Hop.class, AggregatedMileageOutput.class);

List<AggregatedMileageOutput> mappedResults = results.getMappedResults();

AggregatedMileageOutput firstItem = mappedResults.get(0);

1
非常感谢您。我刚刚修改了我的聚合表达式并删除了“$mileage”,现在它可以正常工作了。 - SHASHANK GAUTAM

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接