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

MongoDB 聚合管線實作分組去重:group + match + aggregate 找出重複 paymentOrder 並保留最大 _id

     編輯:DB2 教學

場景

集合 paymentinfo 含 paymentOrder 欄位,需找出重複群組並刪除多餘文件,保留每組 _id 最大者。

聚合管線分步建構

1. 分組統計($group)

var group = [
  { $group: {
      _id: "$paymentOrder",
      max_id: { $max: "$_id" },
      count: { $sum: 1 }
  }},
  { $sort: { count: -1 }}
];
  • 輸出欄位:_id(paymentOrder)、max_id、count。

2. 篩選重複群組($match)

var match = { $match: { count: { $gt: 1 }}};

3. 管線組合執行

var ds = db.paymentinfo.aggregate(group);  // 先跑 group
group.push(match);                          // 將 match 推入管線陣列
var ds = db.paymentinfo.aggregate(group);  // 再跑完整管線

關鍵:aggregate 第一參數為管線陣列,match 必須 push 進陣列,不能作為第二參數(選項)。

刪除多餘文件腳本

var ds = db.paymentinfo.aggregate(group);  // 含 match
for (var i = 0; i < ds.result.length; i++) {
  var child = ds.result[i];
  var oid = child.max_id;
  var payorder = child._id;
  var ps = db.paymentinfo.find({ paymentOrder: payorder }).toArray();
  for (var j = 0; j < ps.length; j++) {
    var pchild = ps[j];
    if (oid.toString() == pchild._id.toString()) {
      print("保留: " + pchild._id);
    } else {
      print("刪除: " + pchild._id);
      db.paymentinfo.remove({ _id: pchild._id });
    }
  }
}

備份先行

mongoexport --port 30000 -d pos -c paymentinfo -o /home/backup/mongodb_pos_paymentinfo_3.txt

注意事項

  • Shell 執行多行腳本易因格式報錯,建議去除換行或逐行輸入。
  • 大量刪除前務必驗證 ds.result 內容正確。
  • 生產環境建議改用 bulkWrite 批次刪除提升效能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved