mongodb去除重复的数据(二)

前天因为工作需要,开始着手对数据库中两千多万的数据中其中一个字段重复的数据进行去重。

原本使用一些测试的数据测试后,前天写的那个方法是可行的,但是当面对这个两千万的真实数据时,我却发现这方法有些不顶用了,最终只好又经过若干次的尝试,总算成功去重。

最终总结一下整个过程:

1、这个方法就是上一篇所讲的,利用mongodb的游标dbcursor和while循环的方式。

var res=db.test.find();
while(res.hasNext()){
      var res1=db.test.find();
      var re=res.next();
      while(res1.hasNext()){
              var re1=res1.next();
              if(re.age==re1.age){
                   db.test.remove({"age":re1.age});
               }
       }
       db.test.insert(re);
}

原本我用了10000调数据进行测试,循环完毕后,就如预期一样只剩下1条数据。但是面对两千万的数据后,执行到一半就报错,并且一直卡在那里。

我也不知道这情况究竟算是正常还是不正常,反正是等了半天的时间还是卡在那里,整个集合的数据也没有任何的变化。

我想大概是一次性处理的数据太多了吧,我的循环那样执行下去,就需要循环两千万乘以两千万次,这个次数是在国语庞大,于是只好采取迂回的措施,把两千万拆分成20个集合,一个集合只装一百万。

但是即便是一百万的数据,当我在执行这个方法时,还是卡在了那里。 于是我不禁就想,难到我要把20个集合再拆分成四十个集合,一个只装五十万?

四十个集合,这工作量貌似有点太大,我选择无奈的放弃。

2、第一种方法失败的情况下,我只好另寻他途,然后便想到了唯一索引的方法。

唯一索引的dropDups可以在建立索引时删除重复的数据,我想这个总应该是可行的吧。然而事实却证明我还是错了,最终还是以失败告终。

在我执行如下方法建立唯一索引的时候,又是屡屡报错,并给我意外退出!

db.alarm1.ensureIndex({"msgContent":1},{"unique":true,dropDups:true})

直接在建立索引的时候删除数据无法达到目的,我只好再次采用迂回的方式,在一个全新的空集合中建立一个索引 :

 db.alarmBack.ensureIndex({"msgContent":1},{"unique":true})

然后再把数据重新的导入到这个已经存在了唯一索引的集合中,我想应该可以了吧。

但是,无奈的是,又失败了!

因为我从生产数据库导出的数据用了mongodump的方式,所以导入的时候也用的mongorestore的方式,而这个方式实际上是恢复数据,在恢复数据的同时,连索引也一起恢复了。

最让我抓狂的是,恢复索引也就罢了,竟然还在恢复的时候把我建的唯一索引给干掉了!这样一来,唯一索引没了,自然无法达到去重的目的,方法再次以失败告终。

我不知道mongodump和mongorestore是否有相关参数可以指定不要索引,有空了一定要试一下(太坑了吧)。

3、上述两个方法都失败了,第二个方法失败的同时,我就想到要试一下另外一种导入和导出的方法:mongoimport和mongoexport。

我隐约记得这两个方法导入导出的时候速度好像比mongodump和mongorestore慢,但是现在没有办法的情况下只好一试。

但是事实证明这个方法在这种情况下居然可行,最终我使用第二种方法中的第二种方式,先在空白集合中建一个唯一索引,然后导入要去重的数据,成功的对这两千多万的数据去重。

不过真的是慢啊,单纯的导入,我用mongodump连mongoimport一半的时间都没用到,不知道是否是因为姿势不对,暂且也不想去管它了!

任务结束,但是心中还留下一个疑问,我想如果第二种方法中我导出的元数据是没有索引的,那么当我导入的时候,不知道它是否还会把我原本的唯一索引干掉,不过暂时有别的事情,也就不做尝试了。

时间: 2024-10-03 13:27:25

mongodb去除重复的数据(二)的相关文章

mongodb去除重复的数据

今天出现了一个新的需求,有个部门需要拿到mongodb中的数据,要求去掉其中一个字段内容相同的数据. 虽然mongodb中有distinct来去重,但是和mysql的distinct不同的是,mysql中能用distinct * 返回整条记录的信息,而mongodb的distinct我却只是返回去重的那个字段的数据(或许mongodb也可以返回整条,但是我不知道). mysql中的distinct返回完整记录: mongodb中distinct去重某个字段: 上边的内容并不是我想看到的结果,因此

Mongodb去除重复的数据,pymongo去重

接上一篇的,发现爬斗鱼主播信息存入Mongodb数据库后,发现很多重复的数据,毕竟斗鱼不可能有这么多的主播,所以很多页是有重复的主播房间的. 查了一下怎么去重,发现比较麻烦,与其存入重复的数据后面再去重,还不如在存入数据库的时候就检查,不去存入重复的数据,这样就避免了后期再去做去重工作.于是改动如下: #-*- coding:utf-8 -*- #_author:John #date:2018/10/25 0:07 #softwave: PyCharm import requests impor

去除重复的数据

在工作工程中我们不必要会遇到,在数组中有重复数据的时候,如何去除重复的数据呢? 第一种:利用NSDictionary的AllKeys(AllValues)方法 代码: NSArray *dataArray = @[@"2014-04-01",@"2014-04-02",@"2014-04-03", @"2014-04-01",@"2014-04-02",@"2014-04-03", @&

[LeetCode] Remove Duplicates from Sorted Array II 有序数组中去除重复项之二

Follow up for "Remove Duplicates":What if duplicates are allowed at most twice? For example,Given sorted array A = [1,1,1,2,2,3], Your function should return length = 5, and A is now [1,1,2,2,3]. 这道题是之前那道Remove Duplicates from Sorted Array 有序数组中

java 数组如何去除重复的数据?

java数组去重example: String[] str={"john","lily","lily","lucy"}; List<String> list=new ArrayList<String>(); for(int i=0;i<str.length;i++){ if(!list.contains(str[i])){ list.add(str[i]); } }

查询重复的数据

我们先准备一张表,结果如图: 现在我们查询一下重复的数据,那就是张三了,我们应该怎么写呢?应该这样写 select * from usertb where name in (select name from usertb group by name having count (name) > 1) 输出结果:.如图: 大家有木有发现,我明明有这些字段和表,为什么还显示无效就是红色的波浪线呢,原因是 原因是SQL Server的intellisense(智能感知功能)需要重新整理一下,用快捷键Ct

JAVA数组去除重复数据

一.用List集合实现   int[] str = {5, 6, 6, 6, 8, 8, 7,4}; List<Integer> list = new ArrayList<Integer>(); for (int i=0; i<str.length; i++) { if(!list.contains(str[i])) { list.add(str[i]); } } System.out.println("去除重复后的list集合"+list); 输出结果是

Java实现数组去除重复数据的方法详解

一.用List集合实现 int[] str = {5, 6, 6, 6, 8, 8, 7,4}; List<Integer> list = new ArrayList<Integer>(); for (int i=0; i<str.length; i++) { if(!list.contains(str[i])) { list.add(str[i]); } } System.out.println("去除重复后的list集合"+list); 输出结果是:

使用aggregate在MongoDB中查找重复的数据记录

我们知道,MongoDB属于文档型数据库,其存储的文档类型都是JSON对象.正是由于这一特性,我们在Node.js中会经常使用MongoDB进行数据的存取.但由于Node.js是异步执行的,这就导致我们无法保证每一次的数据库save操作都是原子型的.也就是说,如果客户端连续两次发起同一事件将数据存入数据库,很可能会导致数据被重复保存.高并发的情况下,哪怕是你在代码中已经做了非常严格的校验,例如插入数据前判断要保存的数据是否已经存在,但仍然有可能会出现数据被重复保存的风险.因为在异步执行中,你没有