Spring Boot MongoRepository无法正确映射聚合

时间:2020-11-02 15:12:51

标签: mongodb spring-boot kotlin spring-data-mongodb

我当前的项目中具有以下文档结构:

[
{
"_id": {"$oid": "5f9a7ed94fea7938c6015e03"},
"ADDRESSES": [
  {
    "STREET_NUMBER": 99,
    "STREET": "Barkey",
    "CITY": "Wilmington Island",
    "COUNTRY": "Austria"
  }
],
"BIRTH_DATE": {"$date": "1967-05-27T00:00:00.000Z"},
"FIRST_NAME": "Wayne",
"ITEM": "employee",
"JOB": "Salesman",
"LAST_NAME": "Bryan",
"WORKDAYS": [
  {
    "WORK_FROM": {"$date": "2020-10-30T08:31:26.000Z"},
    "WORK_TO": {"$date": "2020-10-30T16:31:26.000Z"}
  },
  {
    "WORK_FROM": {"$date": "2021-08-04T11:31:05.000Z"},
    "WORK_TO": {"$date": "2021-08-05T00:31:05.000Z"}
  },
  {
    "WORK_FROM": {"$date": "2021-04-13T09:53:34.000Z"},
    "WORK_TO": {"$date": "2021-04-13T11:53:34.000Z"}
  }
]
}
]

我想查询mongo数据库上的聚合,这就是我的MongoRepository的样子:

@Repository
public interface MongoRep extends MongoRepository<Person, Long> {
    @Meta(allowDiskUse = true)
    @Aggregation(pipeline = {" " +
            "{$unwind: $WORKDAYS},\n" +
            "    {$unwind: $ADDRESSES},\n" +
            "    {\n" +
            "        $group: {\n" +
            "            _id: $_id,\n" +
            "            workingHours: {\n" +
            "                $sum: {$divide: [{$subtract: [$WORKDAYS.WORK_TO, $WORKDAYS.WORK_FROM]}, 3600000]}\n" +
            "            },\n" +
            "            age: {\n" +
            "                $first: { $subtract: [{$year: $$NOW},{$year: $BIRTH_DATE}]}\n" +
            "            },\n" +
            "            firstname: {\n" +
            "                $first: $FIRST_NAME\n" +
            "            },\n" +
            "            lastname: {\n" +
            "                $first: $LAST_NAME\n" +
            "            },\n" +
            "            city: {\n" +
            "                $first: $ADDRESSES.CITY\n" +
            "            },\n" +
            "            job: {\n" +
            "                $first: $JOB\n" +
            "            }\n" +
            "        }\n" +
            "    },\n" +
            "    {$project: {\n" +
            "             _id: 0,"  +
            "            age: $age,\n" +
            "            city: $city,\n" +
            "            firstname: $firstname,\n" +
            "            lastname: $lastname,\n" +
            "            workinghours: $workingHours,\n" +
            "            job: $job,\n" +
            "\n" +
            "        }}"})
    public AggregationResults<PersonDTOImpl> findAllAggregated();

这是我的DTO课程:

@Document(collection = "employee")
 class PersonDTOImpl(
     @Field(name = "age") override val  age: Int,
    @BsonProperty("city")  override val city: String,
    @BsonProperty( "firstname") override val firstname: String, @Field(name = "job") override val job: String,
    @Field(name = "lastname") override val lastname: String, @Field(name = "workinghours") override val workinghours: Double) : PersonDTOInterface {

}

不幸的是,执行查询时出现异常:

Failed to instantiate PersonDTOImpl using constructor fun <init>(kotlin.Int, kotlin.String, kotlin.String, kotlin.String, kotlin.String, kotlin.Double): at.fhj.swd.kotlintraditionalpostgres.person.mongo.PersonDTOImpl with arguments null,null,null,null,null,null

我试图修改mongo查询以使其在没有投影但没有运气的情况下运行。 在mongo控制台中运行该聚合时,效果很好。

我们非常感谢您的帮助, 谢谢。

编辑: 好像查询返回了错误的(BSON)结果,这是屏幕截图。但是在Mongo控制台中运行该查询时,它会返回正确的结果。

enter image description here

0 个答案:

没有答案
相关问题