我对如何解决这个问题感到困惑。
我有一个非常大的数据集,有大约一百万条记录。每行包含一个人,他/她的ID和他/她的地址。但是一个人可能有多个地址,并且数据根本没有组织。
从.csv文件读取数据时,由于数据集太大,我被迫在创建Person对象的实例时对数据进行分块。同时,我想创建一个架构,使一个人记录包含ID和一个地址列表(我想聚合一个人对应的地址,并在其中创建一个Person对象)。解决这个问题的最简单方法是什么?我应该创建某种中间模式并尝试将其组合吗?
答案 0 :(得分:1)
我的方法如下:
之后,您的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"
}
}
对该集合执行aggregation query以便按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字段上创建索引,这将提高聚合的性能。