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 <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});
            }
        }
    }
 }

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

时间: 2024-12-12 05:38:41

mongodb 分组查询统计去掉重复的记录的相关文章

mysql查询所有记录,并去掉重复的记录

distinct(str)函数是用来去掉重复记录的,但是它只是针对某一个字段可以去重复.例如:select distinct(name)from tablename; 但是如果想把其他字段值的记录也查询出来,我一开始想的是使用select distinct(name) ,ta.* from tablename.注意distinct必须放在前面!但是这样并没有去掉重复的记录,后来想到了group by.所以呢,如果想去掉表中某个字段的重复的记录,并且查询出来所有字段的值.那么就这样写就ok啊,例如

mongodb 分组查询

数据的保存 include_once 'mDB.class.php'; $m=new mDB(); $m->setDB('mydb'); // $m->save('stu',['dept'=>'财务','name'=>'张三','age'=>73]); // $m->save('stu',['dept'=>'计算机','name'=>'张四','age'=>53]); // $m->save('stu',['dept'=>'计算机','na

用SQL语句去掉重复的记录(转)

海量数据(百万以上),其中有些全部字段都相同,有些部分字段相同,怎样高效去除重复? 如果要删除手机(mobilePhone),电话(officePhone),邮件(email)同时都相同的数据,以前一直使用这条语句进行去重: Sql代码 delete from 表 where id not in (select max(id) from 表 group by mobilePhone,officePhone,email ) or delete from 表 where id not in (sel

MongoDB分组查询,聚合查询,以及复杂查询

准备数据 from pymongo import MongoClient import datetime client=MongoClient('mongodb://localhost:27017') table=client['db1']['emp'] l=[ ('张飞','male',18,'20170301','',7300.33,401,1), #以下是教学部 ('张云','male',78,'20150302','teacher',1000000.31,401,1), ('刘备','m

SQL实现分组查询取前几条记录

我要实现的功能是统计订单日志表中每一个订单的前三条日志记录,表结构如下: 一个订单在定点杆日志表中有多条记录,要根据时间查询出每一个订单的前三条日志记录,sql如下: select b.OrderNumber,b.creationtime,b.remark FROM ( SELECT a.OrderNumber,a.CreationTime,a.Remark FROM [FortuneLabFord].[dbo].[SO_Log] a where a.SysId IN ( select TOP

mysql千万级数据量查询出所有重复的记录

查询重复的字段需要创建索引,多个条件则创建组合索引,各个条件的索引都存在则不必须创建组合索引 有些情况直接使用GROUP BY HAVING则能直接解决:但是有些情况下查询缓慢,则需要使用下面其他的方法 以下是本人整理出来的查询重复数据的SQL,适用于千万级数据量的MYSQL数据库. 1.适用于整数类型的 SELECT DISTINCT UId FROM vehicle WHERE 1=1 GROUP BY UId HAVING(COUNT(UId))>1; 2.分组排序 SELECT UId

Hibernate的一对多查询及去掉重复的对象distinct

问:sql 中 select * from A left join B on A.id=B.id where A.id=? 如果在Hibernate 中 用HQL 怎么表达呢 ? 答:from A left join A.b b where A.id=? 其中b是在实体类A的hibernate配置文件中映射的对象B <hibernate-mapping package="com.XXXX.entities">    <class name="A"

mysql查询出所有重复的记录

假如我们有如下一张数据表(很简单,只是举例而已),表名为student.现在我们要取出其中重复记录.重复是以name相同为判定标准. ID name phone age 1 张三 10086 15 2 李四 10010 20 3 王五 10010 22 4 赵六 10010 22 5 孙七 10010 22 查找出所有的重复数据 SELECT * FROM student WHERE phone IN (SELECT shortname FROM student GROUP BY phone H

linq 多表分组查询统计

var q1 = from orderitem in q2 join pd in _iProductDetailContract.Entities on orderitem.ProductDetailId equals pd.Id join pm in ProductMainContract.Entities on pd.ProductMainId equals pm.Id join user in UserContract.Entities on pm.BuyerId equals user.