Spring Data MongoDb-处理聚合分组产生的复合ID字段映射的最佳方式



在原生MongoDb行为中,Aggregation Grouping操作的结果是由分组的字段组成的复合文档id。在Spring Data Mongo 3.x之前,Spring映射层会分解分组产生的复合id,并自动将复合id的每一部分映射到其原始字段。

2.x:

Aggregation.group( FieldOne, FieldTwo, FieldThree ) --> Document { _id: null, FieldOne: X, FieldTwo: Y, FieldThree: Z } 

3.x:

Aggregation.group( FieldOne, FieldTwo, FieldThree ) --> Document { _id: [FieldOne: X, FieldTwo: Y, FieldThree: Z], FieldOne: null, FieldTwo: null, FieldThree: null }

https://jira.spring.io/browse/DATAMONGO-2437

有人找到一种优雅的方式来模拟SpringDataMongoDB 2.x的旧行为吗?我正在做一个有大量Mongo集合和Spring Data Mongo聚合的项目,我不想对它们进行大量修改,也不想为每一个都编写自定义的Spring转换器。

没有"春天的魔法;为此。换句话说,在SpringDataMongoDB 2.x中,没有一个迁移配置/方法可以利用扁平化行为

如Github评论所示:https://github.com/spring-projects/spring-data-mongodb/issues/3458#issuecomment-752678298,需要提供一个项目阶段来手动压平字段,或者在应用程序级中引入相应的复合id字段

示例:(Java(

项目阶段:

Aggregation.project(
Fields.from(
Fields.field("Field1", "$_id.Field1"), 
Fields.field("Field2", "$_id.Field2")
)).andExclude("_id") // optional if you want to remove composite id field in mapped results

在应用程序级别引入复合id:

class A {
CompositeId id;
class CompositeId {
Field1 field1;
Field2 field2;
}
}

最新更新