【问题标题】:MongoDB storing random dataMongoDB存储随机数据
【发布时间】:2019-02-13 19:30:40
【问题描述】:

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

我有一个非常大的数据集,有大约百万条记录。每行包含一个人、他/她的 ID 和他/她的地址。但是一个人可能有多个地址,而且数据根本没有组织。

从 .csv 文件中读取数据时,我不得不在创建 Person 对象的实例时对数据进行分块,因为数据集太大了。同时,我想创建一个模式,使一个人记录包含 ID 和地址列表(我想聚合与一个人对应的地址并从中创建一个 Person 对象)。解决这个问题的最简单方法是什么?我应该创建某种中间模式并尝试将其组合吗?

【问题讨论】:

    标签: java database spring mongodb dataset


    【解决方案1】:

    我的方法如下:

    • 将所有 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"    
        }
    }
    
    • 对该集合执行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 字段上创建一个索引,这将提高您的聚合性能。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 2018-05-14
      • 1970-01-01
      • 2016-06-05
      • 2015-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多