我不知道如何解决这个问题。
我有一个非常大的数据集,其中包含约百万条记录。每行包含一个人、他/她的 ID 和他/她的地址。但是一个人可能有多个地址,数据根本没有组织。
从 .csv 文件中读取,我在创建 Person 对象的实例时被迫对数据进行分块,因为数据集太大了。同时,我想创建一个模式,使一个人的记录包含 ID 和地址列表(我想聚合对应于一个人的地址,并从中创建一个 Person 对象)。解决这个问题最简单的方法是什么?我应该创建某种中间模式并尝试组合它吗?
最佳答案
我的方法如下:
- 将所有 csv block 导入一个集合中,假设为“临时”(是的,它将是临时的)
在那之后,你的 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"} ])
这将生成具有以下文档结构的集合 (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 字段上创建一个索引,这将提高聚合的性能。
关于java - MongoDB 存储随机数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52239575/