集合 paymentinfo 含 paymentOrder 欄位,需找出重複群組並刪除多餘文件,保留每組 _id 最大者。
var group = [
{ $group: {
_id: "$paymentOrder",
max_id: { $max: "$_id" },
count: { $sum: 1 }
}},
{ $sort: { count: -1 }}
];
_id(paymentOrder)、max_id、count。var match = { $match: { count: { $gt: 1 }}};
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
ds.result 內容正確。bulkWrite 批次刪除提升效能。