mongodb版本號是,MongoDB shell version: 2.4.4
操作環境,shell窗口 ,如下所示:
[mongo_user@mongodb_dbs ~]# mongo --port 30100
MongoDB shell version: 2.4.4
connecting to: 127.0.0.1:30000/test
mongos>
mongos> use pos
switched to db pos
mongos>
1,先統計分組記錄數,以paymentOrder字段來分組統計,查詢出所有的統計結果,分組統計數>1的
// 這裡分組統計出來取分組字段paymentOrder的值_id、最大的objectid值max_id、分組統計數count
var group=([
{$group:{_id:"$paymentOrder", max_id: {$max:"$_id"},count: { $sum: 1 }}},
{$sort:{count:-1}}
])
2,定義就是找出存在重復的分組,使用管道操作符 match,條件是普通查詢的格式,但是作用於 group的輸出結果的格式:
var match ={"$match":{"count" : {"$gt" : 2}}};
3,最後,通過聚合框架函數db.paymentinfo.aggregate(group, match)就得到了存在重復數據的分組。這個過程看似復雜,其實實現的只是T-SQL中的group by … having … 的語法。
var ds=db.paymentinfo.aggregate(group, match);
PS:這裡match無效,出來很多count為1的數據,也就是說{“match":{"count" : {"gt” : 2}}};失敗,why?
4,刪除之前先備份好
備份
/usr/local/mongodb/mongodb-linux-x86_64-2.4.4/bin/mongoexport --port 30000 -d pos -c paymentinfo -o /home/backup/mongodb_pos_paymentinfo_3.txt
5,開始循環刪除
這裡ds就是一個大的結果集,直接用ds.result就可以獲取結果集裡面分組查詢出來的數據:
//下面開始啟用循環來遍歷,aggregate出來的result已經具備了數組的特性,可以直接for循環處理
var ds = db.paymentinfo.aggregate(group, match);
for (var i = 0;i 1來過濾掉沒有重復的數據,只對有重復的進行數據處理操作
if(count>1){
var oid=child.max_id;
print(count);
//這裡獲取分組中最大的objectid的集合記錄的objectid
var payorder=child._id;
//獲取重復的paymentOrder的所有記錄查詢出來,進行遍歷
var ps=db.paymentinfo.find({"paymentOrder":payorder });
//直接find後需要用toArray()來進行處理變成數組這樣才可以遍歷
var psc=ps.toArray();
for(var j=0; j<psc.length; j++){="" var="" pchild="psc[j];" 將objectid進行遍歷,如果是最大的那條記錄保留,不是就刪除remove掉="" if(oid.tostring()="=pchild._id.toString()){" print("the="" same="" one");print(pchild._id.tostring());="" print(oid.tostring());="" }else{="" other="" one="" -----");print(pchild._id.tostring());print(oid.tostring());db.paymentinfo.remove({"_id":pchild._id});="" }="" }BY THE WAY:如果你copy我的腳本,去shell下的mongos客戶端執行報錯,有可能是格式錯誤,你可以去掉所有的換行符號或者你自己手動輸入一遍,去執行,就不會報錯了。