【发布时间】: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