Mongo-合并集合中的重复条目并删除旧条目

时间:2019-05-26 15:44:26

标签: mongodb

我正在尝试将读取数百万个CSV文件的旧数据库迁移到Mongodb。旧数据库有数百万个条目,从本质上讲,我希望新数据库具有这三个字段-联系人姓名,电子邮件和联系电话。我将从数百种不同格式的CSV文件中读取此信息。我已经编写了一个python脚本,将从这些文件中提取信息,并将其放在以下布局的新csv文件中:

电子邮件:姓名:Contact_No

我遇到的问题是,其中一些电子邮件存在于多个CSV文件中,并且可能具有多个不同的联系电话。当我使用mongoimport命令导入这些CSV文件时,同一封电子邮件可能会有多个条目。

我正在尝试在主集合中创建一个条目,其格式如下:

{
  Email:samplemail@xxx.com
  Name: John Doe
  Phone: [
           12345678,
           23456789,
           12354677,
         ]

}

我对Mongo感到陌生,因此我希望具有更多洞察力和经验的人能够为我当前的实施提供替代解决方案。

*********************当前实施************************ *

目前,我按照以下4个步骤将CSV文件导入数据库。

  1. 使用mongo import命令导入数据库

mongoimport -d Master_Contacts -c Master_Collection --type csv --file '/root/Documents/log.csv' --columnsHaveTypes --fields "Email.string(),Name.string(),Number.string()" --numInsertionWorkers 8

这似乎工作正常。我可以在大约2分钟的时间内导入大约160万个条目,而只分配8GB的内存。

  1. 删除重复项

我当前删除重复项的实现如下。我使用聚合函数为同一封电子邮件找到多个条目->使用该电子邮件和相关号码查找所有条目,然后使用以下命令将它们输出到称为重复项的新集合中:

db.Master_Collection.aggregate([{$group: {_id: {email:"$email"},count: { "$sum":1 },number:{$addToSet:"$number"}}},{ $match: {count: { "$gt": 1 }}}, {$out:"duplicates"}],{allowDiskUse:true})

然后使用以下命令从原始集合中删除这些结果:

db.Master_Collection.aggregate([{$group: {_id: {email:"$email"},count: { "$sum":1 },number:{$addToSet:"$number"}}},{ $match: {count: { "$gt": 1 }}}],{allowDiskUse:true}).forEach(function(doc){print(db.Master_Collection.remove({"email":doc._id.email}))});

  1. 将重复收藏中的所有条目插入回到原始收藏中

然后我再次遍历重复项集合并将所有条目插入主集合。然而,这似乎是非常低效且耗时的。

任何人都可以提供建议或替代解决方案。

先谢谢大家

1 个答案:

答案 0 :(得分:0)

我建议您先汇总重复项,然后再插入目标表。您可以在Python脚本中执行此操作,最好在内存中收集重复的联系信息,并将其存储在字典的适当条目中。

然后批量插入字典。

这些更少的步骤和更少的I / O操作应该为您带来更好的性能。