【问题标题】:Nested class object with Spring data MongoDb aggregation returns null field具有 Spring 数据 MongoDb 聚合的嵌套类对象返回空字段
【发布时间】:2021-08-10 23:23:37
【问题描述】:

我在聚合中包含嵌套类时遇到问题。

这是我收藏的 json 文档的预览:

{
    "id": "1234",
    "typeApp": "API",
    "name": "name",
    "versionNum": "1",
    "release": {
        "author": "name",       
        //some other data
    }
}

文档java类:

@Document(collection = "myClassExamples")
public class MyClassExampleDocument {
    @Id
    private String id;
    private String typeApp;
    private String name;
    private String versionNum;
    private Release release;
  
    public static class Release {        
        private String author;
        //Other fields...
    }
   }

我正在尝试构建一个查询,通过参数中给定的 typeApp 查找最后一个文档组,并按 versionNum DESC 排序以通过 typeApp.

我从一个更简单的查询开始,typeApp 的一个简单组:

 Aggregation aggregation = newAggregation(
                Aggregation.sort(Sort.Direction.DESC, "versionNum"),
                Aggregation.group("typeApp"),
                project(MyClassExampleDocument.class)
        )

查询返回一个 MyClassExampleDocument 列表,除了 id 填充有 typeApp 之外,所有字段都具有空值。

您知道如何构建聚合以获取存储在我的集合中的整个对象吗?

感谢您的帮助!

【问题讨论】:

    标签: java mongodb spring-data aggregation-framework


    【解决方案1】:

    你可以像下面这样使用

    public List<MyClassExampleDocument> test() {
    
        Aggregation aggregation = Aggregation.newAggregation(        
            sort(Sort.Direction.DESC, "versionNum"),
            group("typeApp").first("$$ROOT").as("data")
            replaceRoot("data")
    
        ).withOptions(AggregationOptions.builder().allowDiskUse(Boolean.TRUE).build());
    
        return mongoTemplate.aggregate(aggregation, mongoTemplate.getCollectionName(MyClassExampleDocument.class), MyClassExampleDocument.class).getMappedResults();
    
    }
    

    这里是聚合

    db.collection.aggregate([
      { "$sort": { versionNum: -1 } },
      {
        "$group": {
          "_id": "$typeApp",
          "data": { "$first": "$$ROOT" }
        }
      },
      { "$replaceRoot": { "newRoot": "$data" } }
    ])
    

    工作Mongo playground

    注意:java代码未经测试,它是基于工作mongo脚本实现的

    【讨论】:

      猜你喜欢
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 2022-08-05
      • 2015-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多