我被困在如何处理这个问题上。
我有一个非常大的数据集,有~百万条记录。每行包含一个人,他/她的ID和他/她的地址。但是一个人可能有多个地址,并且数据根本没有组织。
从.csv文件中读取,我被迫在创建 Person 对象的实例时对数据进行分块,因为数据集太大了。同时,我想创建一个架构,以便一个人记录包含 ID 和地址列表(我想聚合对应于一个人的地址并从中创建单个 Person 对象(。解决这个问题的最简单方法是什么?我应该创建某种中间模式并尝试组合它吗?
我的方法是以下:
- 导入集合中的所有 CSV 块,假设"临时"(是的,这将是临时的(
之后,你的shema应该看起来像这样(取决于你的csv(:
{_id : ObjectId(abcd11241545),
id : 001 <======== your id
address : {
street : "56 avenue des Champs Elysee",
street2 :"",
zip : "75000",
city:"Paris",
country:"France"
}
}
{_id : ObjectId(abcd11241545),
id : 001
address : {
street : "23 rue de la plage",
street2 :"Residence du soleil",
zip : "06000",
city:"Nice",
country:"France"
}
}
对该集合执行聚合查询以按 ID 分组,在数组中添加唯一地址,并创建一个具有$out阶段的新集合"persons":
db["temp"].aggregate([ {$group:{ _id:"$id", addresses : {$addToSet : "$address"} } }, {$out : "persons"} ])
这将生成集合(人员((或覆盖它,如果它已经存在,请注意(,具有以下文档结构:
{_id : 001,
addresses : [
{street : "56 avenue des Champs Elysee",
street2 :"",
zip : "75000",
city:"Paris",
country:"France"},
{street : "23 rue de la plage",
street2 :"Residence du soleil",
zip : "06000",
city:"Nice",
country:"France"}
]
}
}
如果集合非常大,请在临时集合中的 id 字段上创建索引,这将提高聚合的性能。