javascript
数据聚合Spring Data MongoDB:嵌套结果
1引言
在上一篇文章中,我們構建了聚合管道的基本示例。 如果您需要有關如何創建項目和配置應用程序的更多詳細信息,也許您想看看使用Spring Data MongoDB和Spring Boot進行數據聚合 。 在本文中,我們將重點研究一個用例,在這種情況下,將結果的一部分分組在一個嵌套對象中是有意義的。
我們的測試數據是足球運動員的集合,其中包含有關他們所屬的聯賽以及進球數的數據。 該文件將是這樣的:
@Document public class ScorerResults {@Idprivate final String player;private final String country;private final String league;private final int goals;public ScorerResults(String player, String country, String league, int goals) {this.player = player;this.country = country;this.league = league;this.goals = goals;}//Getters and setters }知道每個聯賽打進多少球可能很有趣。 另外,誰是聯盟的最佳射手。 在下一節中,我們將不使用嵌套對象來實現第一個簡單示例。
您可以在我的Github存儲庫中找到所有這些示例的源代碼。
2基本示例
我們可以使用以下類來存儲每個聯賽的結果:
public class ScorerNotNestedStats {private String league;private int totalGoals;private String topPlayer;private String topCountry;private int topGoals;//Getters and setters }為了檢索得分最高的得分手,我們首先需要按進球數對文件進行排序,然后按聯賽對它們進行分組。 在存儲庫中,通過以下方法實現管道的這兩個階段:
private SortOperation buildSortOpertation() {return sort(Sort.Direction.DESC, "goals"); }private GroupOperation buildGroupOperation() {return group("league").first("league").as("league").sum("goals").as("totalGoals").first("player").as("topPlayer").first("goals").as("topGoals").first("country").as("topCountry"); }那應該做。 讓我們使用Spring的mongoTemplate匯總結果:
public List<ScorerNotNestedStats> aggregateNotNested() {SortOperation sortOperation = buildSortOpertation();GroupOperation groupOperation = buildGroupOperation();return mongoTemplate.aggregate(Aggregation.newAggregation(sortOperation,groupOperation), ScorerResults.class, ScorerNotNestedStats.class).getMappedResults(); }如果我們檢索西班牙聯賽的統計數據,則會得到以下結果:
盡管這很公平,但是我對整個結果類中分散的所有頭號得分手的信息感到不滿意。 我認為,如果我們可以將所有計分員的數據封裝到一個嵌套對象中,那將更加有意義。 幸運的是,我們可以在聚合過程中直接做到這一點。
3嵌套結果
Spring Data的嵌套方法旨在在投影階段創建子文檔。 這將使我們能夠將頂級目標球類創建為輸出結果類的屬性:
ProjectionOperation projectionOperation = project("totalGoals").and("league").as("league").and("topScorer").nested(bind("name", "topPlayer").and("goals", "topGoals").and("country", "topCountry"));在上面的行中,嵌套方法topscorer被嵌套,該嵌套文檔將包含有關當前聯賽最佳射手得分的所有數據。 使用bind方法(topPlayer,topGoals和topCountry)將其屬性映射到輸出類。
MongoTemplate的調用重用了我們先前的排序和分組操作,然后添加了投影操作:
return mongoTemplate.aggregate(Aggregation.newAggregation(sortOperation,groupOperation,projectionOperation ), ScorerResults.class, ScorerStats.class).getMappedResults();執行此查詢將得到更緊湊的結果,所有最重要的進球者相關數據都包裝在其自己的類中:
4。結論
Spring Data MongoDB嵌套方法對于通過聚合查詢創建結構良好的輸出結果非常有用。 在聚合過程中執行此步驟有助于避免使用Java代碼對結果進行后處理。
我正在Google Plus和Twitter上發布我的新帖子。 如果您要更新新內容,請關注我。
翻譯自: https://www.javacodegeeks.com/2016/05/data-aggregation-spring-data-mongodb-nested-results.html
總結
以上是生活随笔為你收集整理的数据聚合Spring Data MongoDB:嵌套结果的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用笔记本电脑怎样打印资料如何使用电脑打
- 下一篇: 海报电子版如何制作如何在电脑上制作海报