Spring Data MongoDB 使用group和unwind實現對陣列資料進行簡單統計
Spring Data MongoDB 使用group和unwind實現對陣列資料進行簡單統計
先簡單交代一下需求:新高考政策下,高中學生可以組合選擇自己喜歡的三門副科,選科結束後教務需要看到這次選科的單科統計資訊。資料庫中儲存的資料結構如下:
{
"_id" : ObjectId("599bc8be5ae9fb99b2ca2499"),
"_class" : "com.xxx.db.model.SelectCourseRecord",
"selectCourse" : "599bc8be5ae9fb99b2ca2498",
"student" : "5993b03f8a4f1a5ba4e05d08",
"courses" : [
"地理",
"物理",
"政治"
],
"removed" : false,
"status" : "success",
"createdTime" : NumberLong(1503381694777)
},
{
"_id" : ObjectId("599bc8be5ae9fb99b2ca249a"),
"_class" : "com.xxx.db.model.SelectCourseRecord",
"selectCourse" : "599bc8be5ae9fb99b2ca2498",
"student" : "599a8faf8a4f1a26dcfef389",
"courses" : [
"化學",
"物理",
"政治"
],
"removed" : false,
"status" : "success",
"createdTime" : NumberLong(1503381694795)
}
也就是我們要得到選了物理、地理、化學和政治的各有多少人,如果科目不是放在陣列裡面的,那很簡單,直接用group
就可以得到結果了。如果直接對courses
做group
,你可能會得到一個莫名其妙的結果!針對這種情況,MongoDB
為我們準備了unwind
方法。unwind
方法會將陣列解開,比如上面的第一個資料,如果對其unwind
的話,可以理解為我們會得到下面這樣的結果:
{
"_id" : ObjectId("599bc8be5ae9fb99b2ca2499"),
"_class" : "com.xxx.db.model.SelectCourseRecord",
"selectCourse" : "599bc8be5ae9fb99b2ca2498",
"student" : "5993b03f8a4f1a5ba4e05d08",
"courses" : "地理",
"removed" : false,
"status" : "success",
"createdTime" : NumberLong(1503381694777)
},
{
"_id" : ObjectId("599bc8be5ae9fb99b2ca2499"),
"_class" : "com.xxx.db.model.SelectCourseRecord",
"selectCourse" : "599bc8be5ae9fb99b2ca2498",
"student" : "5993b03f8a4f1a5ba4e05d08",
"courses" : "物理",
"removed" : false,
"status" : "success",
"createdTime" : NumberLong(1503381694777)
},
{
"_id" : ObjectId("599bc8be5ae9fb99b2ca2499"),
"_class" : "com.xxx.db.model.SelectCourseRecord",
"selectCourse" : "599bc8be5ae9fb99b2ca2498",
"student" : "5993b03f8a4f1a5ba4e05d08",
"courses" : "政治",
"removed" : false,
"status" : "success",
"createdTime" : NumberLong(1503381694777)
}
注意看,除了courses
這一項不一樣,其他的值都是一樣的!那麼此時我們再來對courses
進行group
的話就可以了。完整的Java
程式碼如下:
@Service
public class DefaultSelectCourseRecordService extends AbstractService implements ISelectCourseRecordService {
@Override
public Map<String, Long> countSubjectSelected(String selectCourseId) {
Aggregation agg = Aggregation.newAggregation(
Aggregation.match(Criteria.where("selectCourse").is(selectCourseId)),
Aggregation.project("courses"),
Aggregation.unwind("courses"),
Aggregation.group("courses").count().as("count"),
Aggregation.project("count").and("courses").previousOperation(),
Aggregation.sort(Sort.Direction.DESC, "count")
);
AggregationResults<SubjectCount> groupResults = mongoTemplate.aggregate(agg, SelectCourseRecord.class, SubjectCount.class);
List<SubjectCount> subjectCounts = groupResults.getMappedResults();
Map<String, Long> subjectCountMap = subjectCounts.stream().collect(Collectors.toMap(t -> t.getCourses(), t -> t.getCount()));
return subjectCountMap;
}
private class SubjectCount {
private String courses;
private long count;
public String getCourses() {
return courses;
}
@SuppressWarnings("unused")
public void setCourses(String courses) {
this.courses = courses;
}
public long getCount() {
return count;
}
@SuppressWarnings("unused")
public void setCount(long count) {
this.count = count;
}
}
}
聚合操作返回結果是SubjectCount
的List
,用了Java8 Stream
轉為了方便一點的Map
,這裡的返回結果格式如下:
{
"政治": 10,
"物理": 10,
"生物": 9,
"歷史": 9,
"化學": 10,
"地理": 9
}
參考文件: https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/
相關文章
- MongoDB aggregate做統計資料(group進階)。MongoDB
- spring-data-mongodb多資料庫訪問實現SpringMongoDB資料庫
- 使用Spring Data JPA進行資料庫操作Spring資料庫
- 使用陣列進行大資料運算陣列大資料
- Spring Data JPA簡單使用Spring
- spring data mongodb配置+月庫實現SpringMongoDB
- javascript實現二維陣列實現簡單介紹JavaScript陣列
- 報表如何實現對資料列進行排名分析?
- 陣列filter方法對陣列元素進行過濾陣列Filter
- c#簡單實現二維陣列和二維陣列列表List<>的轉置C#陣列
- [譯] 使用 Pandas 對 Kaggle 資料集進行統計資料分析
- python pandas超簡單 對單列值進行計數 value_countsPython
- MongoDB之資料查詢(陣列)MongoDB陣列
- SQL對資料進行按月統計或對資料進行按星期統計的例項程式碼SQL
- 陣列的七個 API 的簡單實現陣列API
- 如何實現簡單的位陣列(bit array)陣列
- C++ 簡單實現陣列類泛型程式設計示例C++陣列泛型程式設計
- Spring Boot整合Spring Data JPA進行資料庫操作Spring Boot資料庫
- 資料結構-棧(通過陣列和單向連結串列實現)資料結構陣列
- 【Mongodb】 對 shard 進行大量資料拆分測試MongoDB
- TypeScript實現陣列相關簡單演算法TypeScript陣列演算法
- 資料結構--單連結串列(通過陣列實現)資料結構陣列
- js實現資料結構--陣列JS資料結構陣列
- 利用Data Vault對資料倉儲進行建模(二)
- 如何快速簡單的實現 Excel資料按列提取Excel
- 在Spring Data MongoDB中實現關係建模 - spring.ioSpringMongoDB
- Go 如何對陣列切片進行去重Go陣列
- JavaScript 使用sort()方法從數值上對陣列進行排序JavaScript陣列排序
- Excel 如何批次將矩陣(多行多列)資料轉為單行或單列資料Excel矩陣
- spring data mongodb 如何以事物的方式進行增刪改查SpringMongoDB
- 資料結構之php實現陣列資料結構PHP陣列
- 使用python對oracle進行簡單效能測試PythonOracle
- Python使用TCP實現簡單對話PythonTCP
- Rust 程式設計,實現簡單的佇列Rust程式設計佇列
- 實際使用Elasticdump工具對Elasticsearch叢集進行資料備份和資料還原Elasticsearch
- ACCESS 在資料表中實現簡單計算
- 使用Spring Data JDBC實現DDD聚合SpringJDBC
- 簡單的資料表統計