| MySQL | MongoDB 聚合管線 |
|---|---|
GROUP BY col | { $group: { _id: "$col", ... }} |
HAVING COUNT(*) > 1 | { $match: { count: { $gt: 1 }}} |
SELECT col, COUNT(*) | { $group: { _id: "$col", count: { $sum: 1 }}} |
db.stu.insert({cid:1,age:14,name:'gom1'});
db.stu.insert({cid:1,age:12,name:'jack2'});
db.stu.insert({cid:2,age:13,name:'Lily3'});
db.stu.insert({cid:2,age:14,name:'tony4'});
db.stu.insert({cid:2,age:9,name:'Harry5'});
db.stu.insert({cid:2,age:13,name:'Vincent6'});
db.stu.insert({cid:1,age:14,name:'bill7'});
db.stu.insert({cid:2,age:17,name:'tim8'});
db.stu.insert({cid:1,age:10,name:'bruce9'});
db.stu.insert({cid:3,age:20,name:'luxi10'});
// 1. 分組統計
var group = [
{ $group: { _id: "$cid", max_age: { $max: "$age" }, count: { $sum: 1 }}},
{ $sort: { count: -1 }}
];
// 2. 篩選重複群組
var match = { $match: { count: { $gt: 1 }}};
// 3. 錯誤寫法:match 作為第二參數(選項)無效
// db.stu.aggregate(group, match); // 錯誤!match 被視為 options
// 4. 正確寫法:push 進管線陣列
group.push(match);
db.stu.aggregate(group); // 正確!
// 錯誤寫法輸出(含 count=1 的 cid=3)
{ "result": [ { "_id": 2, "max_age": 17, "count": 5 },
{ "_id": 1, "max_age": 14, "count": 4 },
{ "_id": 3, "max_age": 20, "count": 1 } ], "ok": 1 }
// 正確寫法輸出(已過濾 count=1)
{ "result": [ { "_id": 2, "max_age": 17, "count": 5 },
{ "_id": 1, "max_age": 14, "count": 4 } ], "ok": 1 }
db.collection.aggregate(pipeline, options):第一參數為管線階段陣列,第二參數為 explain/allowDiskUse/cursor 等選項。$group、$match、$sort…)必須置於管線陣列內。push() / unshift() / splice()。同理可實現 HAVING SUM(x) > 100、HAVING AVG(y) < 50 等任意聚合條件篩選。