mongodb 分组查询统计去掉重复的记录

本文介绍了在MongoDB中如何进行分组查询以统计并去除重复记录。首先通过paymentOrder字段进行分组,筛选出分组数量大于1的结果。接着,尝试使用match操作符处理重复分组但遇到问题。在删除重复记录前,强调了备份数据的重要性。最后,展示了循环删除的步骤,并提醒在不同环境下可能存在的格式问题。

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                       

mongodb版本号是,MongoDB shell version: 2.4.4
操作环境,shell窗口 ,如下所示:

[mongo_user@mongodb_dbs ~]# mongo --port 30100MongoDB shell version: 2.4.4connecting to: 127.0.0.1:30000/testmongos> mongos> use posswitched to db posmongos> 
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

1,先统计分组记录数,以paymentOrder字段来分组统计,查询出所有的统计结果,分组统计数>1的

// 这里分组统计出来取分组字段paymentOrder的值_id、最大的objectid值max_id、分组统计数countvar group=([         {$group:{_id:"$paymentOrder", max_id: {$max:"$_id"},count: { $sum: 1 }}},     {$sort:{count:-1}}])
  
  • 1
  • 2
  • 3
  • 4
  • 5

2,定义就是找出存在重复的分组,使用管道操作符 matchgt” : 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
  
  • 1

5,开始循环删除

这里ds就是一个大的结果集,直接用ds.result就可以获取结果集里面分组查询出来的数据:

  //下面开始启用循环来遍历,aggregate出来的result已经具备了数组的特性,可以直接for循环处理  var ds = db.paymentinfo.aggregate(group, match);  for (var i = 0;i <ds.result.length ; i++) {    var child=ds.result[i];    var count=child.count;      //因为上面第二步的{"$match":{"count" : {"$gt" : 2}}};过滤无效,所以这里加一个count>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{                print("the other one -----");print(pchild._id.toString());print(oid.toString());db.paymentinfo.remove({"_id":pchild._id});            }        }    }    }
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

BY THE WAY:如果你copy我的脚本,去shell下的mongos客户端执行报错,有可能是格式错误,你可以去掉所有的换行符号或者你自己手动输入一遍,去执行,就不会报错了。

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值