【问题标题】:Spring Boot MongoRepository not Mapping Aggregation CorrectlySpring Boot MongoRepository 未正确映射聚合
【发布时间】:2021-02-15 06:21:35
【问题描述】:

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

[
{
"_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 控制台中运行时,相同的查询会返回正确的结果。

【问题讨论】:

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


    【解决方案1】:

    开发人员您好,

    希望我回答你的问题还不算太晚。您的 @Aggregation 注释有错误的管道。根据:https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/repository/Aggregation.html,当您想要一个具有多个阶段的管道时,您必须遵循以下模式:

    @Aggregation(pipeline = {"stage1", "stage2"})
    

    你的情况是这样的:

    @Aggregation(pipeline = {"{$unwind: $WORKDAYS}" , "{$unwind: $ADDRESSES}", "{$group: {...}}", "{$project: {}}"})
    

    如果您在 @Aggregation 上注意到您实际上是用逗号分隔各个阶段,因此创建了一个字符串数组。你有一个字符串数组,因为你在顶部添加了“”,这意味着最后一个阶段聚合了所有其他阶段,这是不正确的,你需要将它们拆分。

    【讨论】:

      猜你喜欢
      • 2017-12-24
      • 1970-01-01
      • 2019-05-21
      • 2020-03-29
      • 2016-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-02
      相关资源
      最近更新 更多