MongoDB当中删除重复记录(Java)

本文介绍了一种通过使用 MongoDB 和聚合框架来识别并删除数据库中重复 URL 的方法,有效提高了数据处理效率。具体步骤包括:通过 Groupby 操作对相同 URL 进行分组统计,然后遍历统计结果,删除除第一条外的所有重复记录。
数据库表描述:

     Table Name:NewsFromWeb

     Column Name 1:_id

     Column Name 2:url

     Column Name 3:title

     Other Columns ....

                              ....

     功能实现的前提:如果数据库表当中有相同的url,则认定是重复的记录.

     功能实现的思路:通过Group by一样的查询,找到有相同的记录,做出列表,并且把记录的第二条以后的数据,进行删除,只保留第一条的记录.

     从SQL实现上类似:select sum(url) as urlCount from NewsFromWeb group by url.

     如下是实现方法:

Java代码  收藏代码
  1. @Test  
  2.     public void checkRepeat(){  
  3.         //first group by key  
  4.         BasicDBObject key = new BasicDBObject();  
  5.         key.put("url"true);  
  6.         BasicDBObject initial = new BasicDBObject();  
  7.         initial.put("urlCount"0);  
  8.         BasicDBObject cond = new BasicDBObject();  
  9.         cond.put("url"1);  
  10.         String reduce = "function(obj,prev) { prev.urlCount++; }";  
  11.         DBObject objMap  = mongoDAO.getCollection().group(key, new BasicDBObject(), initial, reduce);  
  12.           
  13.         Set set = objMap.keySet();  
  14.         Iterator it = set.iterator();         
  15.         while(it.hasNext()){  
  16.           String str_key = (String) it.next();  
  17.           String recordStr = objMap.get(str_key).toString();  
  18.           DBObject doc = (DBObject) JSON.parse(recordStr);  
  19.           if (Double.valueOf(doc.get("urlCount").toString())>1){  
  20.               BasicDBObject condDel = new BasicDBObject();  
  21.                 cond.put("url", doc.get("url").toString());  
  22.                 DBCursor map  = mongoDAO.getCollection().find(cond);  
  23.                 int j=0;  
  24.                 while(map.hasNext()){  
  25.                     DBObject obj = map.next();  
  26.                     if (j>0){  
  27.                         System.out.println("正在删除:"+obj);  
  28.                         mongoDAO.getCollection().remove(obj);  
  29.                     }  
  30.                     j++;  
  31.                 }               
  32.           }  
  33.         }  
  34.     }  
 

     本人通过测试10万条数据处理大约2分钟左右,只是一个大概的数据,其实跟硬件和重复记录有很大关系,感觉速度还能接受(CPU老赛扬1.6,Window环境)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值