【发布时间】:2019-05-27 04:06:54
【问题描述】:
我正在尝试将读取数百万个 CSV 文件的旧数据库迁移到 Mongodb。旧数据库有数百万个条目,基本上我想要的是新数据库有这三个字段 - 联系人姓名、电子邮件和联系号码。我将从数百个不同格式的 CSV 文件中读取这些信息。我编写了一个 python 脚本,它将从这些文件中提取信息并将它们放入一个新的 csv 文件中,布局如下:
电子邮件:姓名:Contact_No
我遇到的问题是,其中一些电子邮件存在于多个 CSV 文件中,并且可能有多个不同的联系号码。当我使用 mongoimport 命令导入这些 CSV 文件时,同一封电子邮件可能有多个条目。
我正在尝试在主集合中创建一个条目,其格式如下:
{
Email:samplemail@xxx.com
Name: John Doe
Phone: [
12345678,
23456789,
12354677,
]
}
我对 Mongo 很陌生,所以我希望有更多洞察力和经验的人能够建议我当前实施的替代解决方案。
********************* 当前实现 ************************ *
目前我通过以下 4 个步骤将 CSV 文件导入数据库。
- 使用 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 的内存。
- 删除重复项
我目前删除重复项的实现如下。我使用聚合函数来查找同一电子邮件的多个条目-> 查找具有该电子邮件和相关号码的所有条目,然后使用以下命令将它们输出到称为重复的新集合:
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}))});
- 将重复集合中的所有条目插入原始集合中
然后我再次遍历重复集合并将所有条目插入到主集合中。然而,这似乎非常低效且耗时。
谁能提供建议或替代解决方案。
提前谢谢大家
【问题讨论】:
标签: mongodb