mongodb数据去重

又是好久不更新了,至于为什么没更的原因,就是懒了。扯淡完,入正题。
因业务需要对mongodb中一亿八千多万的数据,针对其中一个字段进行去重处理。一把辛酸泪,分享一下踩过的坑。

第一种方式(网上扒的,然并卵的那种),使用mongodb游标dbcursor和while循环。看起来长成下面这样。

1
2
3
4
5
6
7
8
9
10
11
12
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);
}

简单测试可行,然而当我开心的咧着小虎牙去生产环境跑时没多久没报错了,并且一直hold在那里。我想着可能数据量太大处理起来需要一些时间吧。结果挂了一晚上,第二天早晨来单位还是老样子,查了一下集合count也没什么变化。WTF~

或许曲线救国一下把分段处理可行吧。然而并不知道这种方式最大可以处理多大的数据量,世上无难事,只要肯放弃了。

接着想到唯一索引,据说唯一索引设置dropDups=true可以在建立索引时删除重复数据。事实证明又一次然并卵。

建立唯一索引时同步删除数据不行,那我mongodump数据后建个新集合,建立好唯一所引后再mongorestore回去呢?尝试发现这个尼玛的更坑,没有去重不说,还把新collection里的唯一索引给咔嚓掉了。一定是我提交姿势不对,下次换个姿势再交。

以上都没用以上都没用以上都没用,这里是华丽的华丽的华丽的分割线。

没用的说完了,来点有用的。备份还原不行不如试试mongoimport和mongoexport。事实证明这个方法居然可行,就是会慢得你想哭。

导入和导出工具使用传送门
https://docs.mongodb.com/manual/reference/program/mongoexport/
https://docs.mongodb.com/manual/reference/program/mongoimport/

发表评论

电子邮件地址不会被公开。 必填项已用*标注