java - MongoDB 存储随机数据

标签 java database spring mongodb dataset

我不知道如何解决这个问题。

我有一个非常大的数据集,其中包含约百万条记录。每行包含一个人、他/她的 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/

相关文章:

java - 如何将HTTP GET请求参数绑定(bind)到JavaBean对象变量?

java - 将 HashMap 的特定键值集复制到另一个 HashMap 中

java - HTTP 状态 404 - 在创建 Spring Boot 应用程序时未找到

c# - dll 中的静态属性生存期或缓存方法

数据库在更新时应用所有以前的迁移,而不仅仅是新迁移

java - 将字符串错误响应转换为 Http 状态代码

java - Spring Security 不拦截

java - Web 应用程序模块的热插拔

sql-server - 分布式数据库事务 vs 跨数据库事务

spring - 从 Spring Boot 1.3.0M1 切换到 1.3.0M2 时出现 "NoClassDefFoundError: GenericApplicationListener"