spring-data-mongo-db 库更新后聚合意外工作
Aggregation works unexpectedly after spring-data-mongo-db library update
今天我将 Spring Boot 从版本 2.2.2.RELEASE 更新到 2.5.2。之后聚合开始表现不同。这是一个示例查询(使用科特林语言):
val aggregation = Aggregation.newAggregation(
Aggregation.match(Criteria.where("_id").isEqualTo(ObjectId("6faa215a23cfcf1524cc4a4b"))),
Aggregation.project().andExclude("_id").andExpression("$$ROOT").`as`("user"),
Aggregation.lookup("user", "user._id", "_id", "sameUser")
)
return reactiveMongoTemplate.aggregate(aggregation, "user", UserTestAgggr::class.java)
data class UserTestAgggrUserTestAgggr(
val user: User,
val sameUser: User
)
对于 2.2.2.RELEASE 版本,此代码有效。但是在 2.5.2 版本中 API 要求 sameUser
参数是一个列表(否则会抛出异常)。
我想避免修改我的查询或对象(因为我的查询或对象太多了)。
所以我想我的问题是:有没有办法让最近的 API 在不降级的情况下表现得像以前一样?
所以我的答案是创建我自己的 MappingMongoConverter,这是一场噩梦,因为它必须扩展 MappingMongoConverter(有些 spring 类 直接注入 MappingMongoConverter 而不是使用 MongoConverter 接口)。还必须将它写在 java 中(这样我就可以依赖 MappingMongoConverter 的原始实现)。一点都不好玩,但为我解决了这个问题。
今天我将 Spring Boot 从版本 2.2.2.RELEASE 更新到 2.5.2。之后聚合开始表现不同。这是一个示例查询(使用科特林语言):
val aggregation = Aggregation.newAggregation(
Aggregation.match(Criteria.where("_id").isEqualTo(ObjectId("6faa215a23cfcf1524cc4a4b"))),
Aggregation.project().andExclude("_id").andExpression("$$ROOT").`as`("user"),
Aggregation.lookup("user", "user._id", "_id", "sameUser")
)
return reactiveMongoTemplate.aggregate(aggregation, "user", UserTestAgggr::class.java)
data class UserTestAgggrUserTestAgggr(
val user: User,
val sameUser: User
)
对于 2.2.2.RELEASE 版本,此代码有效。但是在 2.5.2 版本中 API 要求 sameUser
参数是一个列表(否则会抛出异常)。
我想避免修改我的查询或对象(因为我的查询或对象太多了)。 所以我想我的问题是:有没有办法让最近的 API 在不降级的情况下表现得像以前一样?
所以我的答案是创建我自己的 MappingMongoConverter,这是一场噩梦,因为它必须扩展 MappingMongoConverter(有些 spring 类 直接注入 MappingMongoConverter 而不是使用 MongoConverter 接口)。还必须将它写在 java 中(这样我就可以依赖 MappingMongoConverter 的原始实现)。一点都不好玩,但为我解决了这个问题。