在開發中,我們常常需要對某個集合內的數據進行聚合操作或統計分析。MongoDB提供了豐富的聚合操作函數,其中分組查詢是其中最常用也是最重要的一個操作。
一、基本概念
所謂分組,就是將相同的數據按照指定的欄位進行歸類,然後進行聚合操作。以學生數據為例,我們可以按照學生的年級欄位進行分組,然後統計每個年級的學生人數、平均分等信息。
db.student.aggregate([ { $group: { _id: "$grade", //按照年級欄位分組 count: { $sum: 1 } //計算每組的學生數量 } } ])
上面的代碼通過aggregate函數實現了分組查詢,首先指定了要分組的欄位,這裡是grade欄位。然後定義了要統計的信息,這裡僅統計每組的學生數量。
二、基本操作符
1、$sum
$sum用於計算指定欄位的總和,僅能用於數值類型欄位。例如,統計每個年級的總分數:
db.student.aggregate([ { $group: { _id: "$grade", totalScore: { $sum: "$score" } //計算每組的總分數 } } ])
2、$avg
$avg用於計算指定欄位的平均值,僅能用於數值類型欄位。例如,統計每個年級的平均分數:
db.student.aggregate([ { $group: { _id: "$grade", avgScore: { $avg: "$score" } //計算每組的平均分數 } } ])
3、$min
$min用於求指定欄位的最小值。例如,統計每個年級的最低分數:
db.student.aggregate([ { $group: { _id: "$grade", minScore: { $min: "$score" } //計算每組的最低分數 } } ])
4、$max
$max用於求指定欄位的最大值。例如,統計每個年級的最高分數:
db.student.aggregate([ { $group: { _id: "$grade", maxScore: { $max: "$score" } //計算每組的最高分數 } } ])
三、進階操作符
1、$push
$push用於將指定欄位的值插入一個數組中,可以用於統計每組包含哪些學生的數據。例如:
db.student.aggregate([ { $group: { _id: "$grade", students: { $push: "$name" } //將每組的學生姓名插入數組中 } } ])
執行結果中,每個年級的結果中都包含了一個數組,在數組中保存了該年級的所有學生的姓名。
2、$addToSet
$addToSet也用於將指定欄位的值插入一個數組中,但與$push不同的是,$addToSet保證數組中的元素不重複。例如:
db.student.aggregate([ { $group: { _id: "$grade", subjects: { $addToSet: "$subject" } //將每組的課程名稱插入數組中 } } ])
執行結果中,每個年級的結果中都包含了一個數組,在數組中保存了該年級包含的所有課程名稱,且不重複。
3、$first、$last
$first和$last分別用於在每個分組中,獲取某個指定欄位的第一個和最後一個值。例如,統計每個年級第一名和最後一名的成績:
db.student.aggregate([ { $group: { _id: "$grade", firstScore: { $first: "$score" }, //每組的第一名成績 lastScore: { $last: "$score" } //每組的最後一名成績 } } ])
四、多欄位分組
除了按照單個欄位進行分組外,還可以按照多個欄位進行分組。例如,統計每個年級每門課程的平均成績:
db.student.aggregate([ { $group: { _id: { grade: "$grade", subject: "$subject" }, //按照多個欄位分組 avgScore: { $avg: "$score" } //計算每組的平均分數 } } ])
首先定義了_id欄位,該欄位同時包含了grade和subject欄位。然後再定義了要統計的信息,這裡是每組的平均分數。
五、分組操作前的過濾
在進行分組查詢前,我們可以通過$match操作符對原始數據進行過濾,只保留符合條件的數據。
db.student.aggregate([ { $match: { subject: "Math" } //篩選出課程為Math的數據 }, { $group: { _id: "$grade", //按照年級欄位分組 count: { $sum: 1 } //計算每組的學生數量 } } ])
上述代碼先通過$match操作符,篩選出了課程為Math的數據,然後再進行分組查詢。
六、總結
分組查詢是MongoDB中最常用也是最重要的操作之一,通過使用豐富的操作符,我們可以對原始數據進行靈活的聚合操作和統計分析。在實際使用中,我們通常會將分組查詢與其他操作符(如$project、$sort等)結合使用,以實現更複雜的數據處理需求。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/186559.html