Mongo DB删除重复数据文档实践

Posted 肖永威

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mongo DB删除重复数据文档实践相关的知识,希望对你有一定的参考价值。

首先,先构造重复数据记录。查询部分数据创建新的数据集“test”,然后重复查询部分数据集合并到新建“test”数据集中,示例代码如下。

db.getCollection('ForecastResult2_0').aggregate([
     '$match':'carduser_id':'$in':[1313943,1726223,1726514],
     '$project':'_id':0,'carduser_id':1,'lateststatus':1,'occurtime':1,'monthnum':1,'recalls':1,'yearmonth':1,'lasttradecount':1,'latestday':1,
     '$out':'db':'ccm','coll':'test'],
     'allowDiskUse':true)
//插入重复纪录
db.getCollection('ForecastResult2_0').aggregate([
     '$match':'carduser_id':'$in':[1313943,1726223],
     '$project':'_id':0,'carduser_id':1,'lateststatus':1,'occurtime':1,'monthnum':1,'recalls':1,'yearmonth':1,'lasttradecount':1,'latestday':1,
     '$merge':'into':'db':'ccm','coll':'test'],
     'allowDiskUse':true)

删除重复数据记录,使用聚合(group)出重复记录数组,再遍历此数组,删除重复数据。

db.getCollection('test').aggregate([
    '$group':'_id':'carduser_id':'$carduser_id','yearmonth':'$yearmonth','count':'$sum':1,'ids':'$addToSet': '$_id',    //把符合的记录的_id放到一个数组ids里
    '$match':'count':'$gt':1],
    'allowDiskUse': true  
).forEach((doc)=>                           //得到重复的结果,循环记录进行删除
  doc.ids.shift();                         //保留一行记录,如果需要全部删除重复的,去掉该行
  db.test.remove('_id':'$in':doc.ids)  //根据重复_id删除指定的记录
)

小结
删除重复记录前,最后做好数据备份,并且如文中方法,先拿少量数据集测试一遍,避免出现误操作,造成不可估量的损失。

以上是关于Mongo DB删除重复数据文档实践的主要内容,如果未能解决你的问题,请参考以下文章

Mongo实战之数据空洞的最佳实践

mongo+mongoose+express

如何在其中一个字段 Mongo Db [重复] 中检索具有最大值的文档

从 Mongo DB 文档的数组中的对象数组中删除一个值

mongo插入和删除文档

mongo删除重复行