MongoDB存储随机数据

时间:2018-09-08 21:34:09

标签: java database spring mongodb dataset

我对如何解决这个问题感到困惑。

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

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

1 个答案:

答案 0 :(得分:1)

我的方法如下:

  • 将所有csv块导入集合中,我们说“ temp”(是的,这是临时的)

之后,您的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字段上创建索引,这将提高聚合的性能。