首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

MongoDB 以 aggregate/group/match 實現 MySQL HAVING COUNT(*) > 1 分組去重邏輯

     編輯:DB2 教學

對應關係

MySQLMongoDB 聚合管線
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 等任意聚合條件篩選。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved