程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> mongodb分組查詢統計去掉重復的記錄

mongodb分組查詢統計去掉重復的記錄

編輯:DB2教程

mongodb分組查詢統計去掉重復的記錄


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客戶端執行報錯,有可能是格式錯誤,你可以去掉所有的換行符號或者你自己手動輸入一遍,去執行,就不會報錯了。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved