【问题标题】:Converting mongodb aggregrate into Spring Boot equivalent将 mongodb 聚合转换为 Spring Boot 等效项
【发布时间】:2020-02-20 20:12:31
【问题描述】:

我有一个工作聚合:

db.getCollection("policies").aggregate([

                      { $match: { "policyData.QuoteOrPolicy.Policy.RatingStateProvCd.Value": "IL" , "policyData.QuoteOrPolicy.Policy.CompanyProductCd.Value" :  "027" , 
                                         "policyData.QuoteOrPolicy.Policy.InitialDataOrderLineCd.Value"  :   "010" } },

                 { $project:{            "policyData.QuoteOrPolicy.PersAutoLineBusiness.PersAutoVeh.Coverage.CoverageCd": 1        }    }                  ,
                   { $unwind: { path: "$policyData.QuoteOrPolicy", preserveNullAndEmptyArrays: true } } ,
                 { $unwind: { path: "$policyData.QuoteOrPolicy.PersAutoLineBusiness", preserveNullAndEmptyArrays: true } } ,
                 { $unwind: { path: "$policyData.QuoteOrPolicy.PersAutoLineBusiness.PersAutoVeh", preserveNullAndEmptyArrays: true } } ,
                   { $unwind: { path: "$policyData.QuoteOrPolicy.PersAutoLineBusiness.PersAutoVeh.Coverage", preserveNullAndEmptyArrays: true } } ,
                    { $group: { _id: "$policyData.QuoteOrPolicy.PersAutoLineBusiness.PersAutoVeh.Coverage.CoverageCd.Value", count: { $sum: 1 } } },
                    {$group:{"_id":null,"coverage_counts":{$push:{"coverage_value":"$_id",
                                               "count":"$count"}}}},
                    {$project:{"_id":0,"coverage_counts":1}}

             ])

按预期工作。 使用它的 mongodb 支持聚合在 Spring Boot 中获得等效的工作,我并不高兴。

任何人都可以“翻译”它吗? 感谢您提供所有信息。

【问题讨论】:

    标签: mongodb spring-boot aggregation-framework


    【解决方案1】:

    您需要熟悉 org.springframework.data.mongodb.core.aggregation.Aggregation 库,以更好地了解如何在 spring 中使用 mongodb 的聚合。

    这是一个示例,说明如何使用查询来使用它:

    mongoOperation.aggregate( Aggregation.newAggregation(
                    Aggregation.match( Criteria.where( "policyData.QuoteOrPolicy.Policy.RatingStateProvCd.Value" ).is( "IL" )
                    .and( "policyData.QuoteOrPolicy.Policy.CompanyProductCd.Value" ).is( "027" )
                    .and( "policyData.QuoteOrPolicy.Policy.InitialDataOrderLineCd.Value" ).is( "010" ) ),
                    Aggregation.project().and( "policyData.QuoteOrPolicy" ).as( "QuoteOrPolicy" ),
                    Aggregation.unwind( "QuoteOrPolicy", true ),
                    Aggregation.unwind( "QuoteOrPolicy.PersAutoLineBusiness", true ),
                    Aggregation.unwind( "QuoteOrPolicy.PersAutoLineBusiness.PersAutoVeh", true ),
                    Aggregation.unwind( "QuoteOrPolicy.PersAutoLineBusiness.PersAutoVeh.Coverage", true ),
                    Aggregation.group( "QuoteOrPolicy.PersAutoLineBusiness.PersAutoVeh.Coverage.CoverageCd.Value" ).count().as( "count" ),
                    Aggregation.group().push( new Document( "coverage_value", "$_id" ).append( "count", "$count" ) ).as( "coverage_counts" ),
                    Aggregation.project( "coverage_counts" )
                 ), "NameOfYourCollection", Document.class );
    

    如果最后的 Document.class 具有与您的查询输出匹配的字段,则可以将其更改为一个类。

    【讨论】:

    • 这很奏效,非常感谢您。一个小的变化是用 BasicDBObject 替换 Document。我很好奇,你怎么知道 Aggregation.project().and("policyData.QuoteOrPolicy").as("QuoteOrPolicy")?我试过 Aggregation.project("policyData.QuoteOrPolicy.PersAutoLineBusiness.PersAutoVeh.Coverage.CoverageCd" ) 我觉得应该和原来的一样工作,但没有。 { $project:{ "policyData.QuoteOrPolicy.PersAutoLineBusiness.PersAutoVeh.Coverage.CoverageCd": 1 } } 获得了我需要的最小数据,但似乎不像 Spring Boot 那样“翻译”。
    • Document 和 BasicDBObject 是可以互换的,这完全取决于您使用的 spring-boot 版本,我目前使用 2.2,强烈建议将 BasicDBObject 替换为 Document。至于项目,在处理作为字段中值的对象时,您希望尽可能靠近顶部,直到您拥有所需的数据然后深入研究。此外,spring 中的聚合确实是字面意思,所以如果你像在原始查询中那样向下钻取,你只会得到你想要的数据的一小部分。如果它对您有用,请记住接受答案。
    • 非常感谢。我肯定会接受这个答案。仍然有点担心,因为原始只有最小数据并且它工作(在 SpringBoot 之外:))并且应该减少 Mongo 上的内存占用,而最高级别的投影将返回更多数据,这些结构对我来说非常丰富。非常感谢您的宝贵时间。
    • 进一步更新:如果我将 { $project:{ "policyData.QuoteOrPolicy.PersAutoLineBusiness.PersAutoVeh.Coverage.CoverageCd": 1 } } 更改为 { $project:{ "policyData.QuoteOrPolicy.": 1 } } 在我原来的 MongoDb 查询中,它使查询执行速度慢了 7 倍,这也反映在 Spring Boot 版本中 :( 这是一个问题,因为查询有很多数据要处理并在更高级别进行投影会导致为要处理的每一行返回大型结构。有什么想法吗?使用“@Aggregrate”会更好吗?@josh-balcitis
    • 不确定。集合上的索引可以帮助提高查询速度,但在不了解数据结构本身的情况下,我无法真正说出如何最好地提高性能。对不起!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 2018-01-08
    • 2022-01-22
    • 2021-09-03
    • 1970-01-01
    • 2021-06-15
    相关资源
    最近更新 更多