查詢:分數 > 0 且人名為 bob 或 jake 的記錄,按人名分組,輸出總分、平均分、最小分、最大分、筆數。
-- 建表
CREATE TABLE demo (
id INT PRIMARY KEY,
person VARCHAR(45) NOT NULL,
score INT NOT NULL
);
-- 插入測試資料
INSERT INTO demo VALUES
(1,'bob',50),(2,'jake',60),(3,'bob',100),(6,'jake',100),(8,'li',100);
-- 聚合查詢
SELECT person,
SUM(score) AS total_score,
AVG(score) AS avg_score,
MIN(score) AS min_score,
MAX(score) AS max_score,
COUNT(*) AS cnt
FROM demo
WHERE score > 0 AND person IN ('bob','jake')
GROUP BY person;
// 集合結構
{ _id: ObjectId, person: String, score: Number }
// 聚合管線
db.demo.aggregate([
{ $match: { score: { $gt: 0 }, person: { $in: ['bob','jake'] } } },
{ $group: {
_id: '$person',
total_score: { $sum: '$score' },
avg_score: { $avg: '$score' },
min_score: { $min: '$score' },
max_score: { $max: '$score' },
cnt: { $sum: 1 }
}}
])
| person | total_score | avg_score | min_score | max_score | cnt |
|---|---|---|---|---|---|
| bob | 150 | 75 | 50 | 100 | 2 |
| jake | 160 | 80 | 60 | 100 | 2 |
| SQL 子句 | MongoDB 階段 | 說明 |
|---|---|---|
| WHERE | $match | 過濾文檔 |
| GROUP BY | $group | 分組聚合 |
| SUM/AVG/MIN/MAX/COUNT | $sum/$avg/$min/$max/$sum:1 | 聚合運算子 |
| SELECT 別名 | _id 欄位名 | 輸出欄位命名 |
{ allowDiskUse: true } 避免記憶體溢出EXPLAIN 分析執行計畫掌握雙語法對照,能在異構資料庫遷移、混合持久化架構中快速轉換思維。