我被困在如何处理这个问题。
我有一个非常大的数据集,有大约百万条记录。每行包含一个人,他/她的ID和他/她的地址。但是一个人可能有多个地址,而且数据根本没有组织。
从.csv文件中读取,在创建Person对象的实例时,我被迫将数据分块,因为数据集太大了。同时,我想创建一个模式,使一个人记录包含ID和一个地址列表(我想聚合对应一个人的地址并从中创建一个Person对象)。最简单的方法是什么?我应该创建某种中间模式并尝试将其组合起来吗?
我的方法如下:
在那之后,你的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"
}
}
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字段上创建索引,这将提高聚合的性能。