MongoDB使用Map Reduce插入来自其他集合的嵌入式文档

mongodb insert embedded documents from other collections massive collections using map reduce

本文关键字:集合 其他 嵌入式 文档 使用 Map Reduce 插入 MongoDB      更新时间:2023-09-26

我将得到的这些文件每个至少有一百万行,最多 15 亿行。当我得到它时,数据被规范化。我需要一种方法将其存储在一个文档中。在大多数情况下,我不是 100% 如何将数据提供给我。它可以是csv,固定宽度文本文件或tsv或其他东西。

目前,我有一些从一些示例CSV导入的集合。

波纹管是我数据缺失字段的一小部分表示

形式

在我的利益中.csv数据重复

受益者.csv超过600万条记录

record # 1
{"userid":"a9dk4kJkj",
 "gender":"male",
 "dob":20080514,
 "start_date":20000101,
 "end_date":20080227}
record # 2
{"userid":"a9dk4kJkj",
 "gender":"male",
 "dob":20080514,
 "start_date":20080201,
 "end_date":00000000}
 same user different start and end dates

声明.csv超过 2 亿条记录

{"userid":"a9dk4kJkj",
     "date":20080514,
     "code":"d4rd3",
     "blah":"data"}

实验室.csv超过 1000 万条记录

{"userid":"a9dk4kJkj",
     "date":20080514,
     "lab":"mri",
     "blah":"data"}

根据我有限的知识,我有三个选择

  1. 对文件进行排序,从数据文件中读取 C++ 成员对象中的 x 量,在 y 处停止,将成员插入 mongodb,继续从 y 开始表示 x 个成员,直到我们完成。这是经过测试和工作的,但对如此庞大的文件进行排序会杀死我们的机器数小时。

    1. 将数据加载到SQL,逐个读取到C ++成员对象中,在mongo中批量加载数据。经过测试并有效,但是,但我想非常避免这种情况。

    2. 将 MONGO 中的文档加载到单独的集合中,并使用 out 参数执行地图缩减以写入集合。我为每个文件加载了文档(如上所示(。不幸的是,我是蒙戈的新手,而且有截止日期。地图缩减的概念对我来说很难理解和实施。我已经阅读了文档并尝试在堆栈溢出MongoDB上使用此答案:将来自多个集合的数据合并为一个。如何?

输出成员集合应如下所示。

{"userid":"aaa4444",
 "gender":"female",
 "dob":19901225,
 "beneficiaries":[{"start_date":20000101,
                  "end_date":20080227},
                  {"start_date":20008101,
                  "end_date":00000000}],
"claims":[{"date":20080514,
         "code":"d4rd3",
         "blah":"data"},
        {"date":20080514,
         "code":"d4rd3",
         "blah":"data"}],
"labs":[{"date":20080514,
         "lab":"mri",
         "blah":"data"}]}

将数据加载到 sql、用 c++ 读取并插入到 mongodb 的性能会胜过地图缩减吗? 如果是这样,我会坚持使用这种方法

我直言,您的数据是map-reduce的良好候选者,因此最好选择选项3:在3个单独的集合中加载mongo中的文档:beneficiariesclaimslabs并对每个集合的userid键执行map-reduce。最后,使用 userid 键上的查找和插入将 3 个集合中的数据集成到单个集合中。

假设您将beneficiaries.csv加载到集合beneficiaries中,这是对受益人进行map-reduce的示例代码:

mapBeneficiaries = function() {
    var values = {
        start_date: this.start_date,
        end_date: this.end_date,
        userid: this.userid,
        gender: this.gender,
        dob: this.dob
    };
    emit(this.userid, values);
};
reduce = function(k, values) {
  list = { beneficiaries: [], gender : '', dob: ''};
  for(var i in values) {
    list.beneficiaries.push({start_date: values[i].start_date, end_date: values[i].end_date});
    list.gender = values[i].gender;
    list.dob = values[i].dob;
  }
  return list;
};
db.beneficiaries.mapReduce(mapBeneficiaries, reduce, {"out": {"reduce": "mr_beneficiaries"}});

mr_beneficiaries 中的输出将如下所示:

{
    "_id" : "a9dk4kJkj",
    "value" : {
        "beneficiaries" : [ 
            {
                "start_date" : 20080201,
                "end_date" : 0
            }, 
            {
                "start_date" : 20080201,
                "end_date" : 0
            }
        ],
        "gender" : "male",
        "dob" : 20080514
    }
}

做同样的事情来获得mp_claimsmp_labs。然后集成到singledocuments

db.mr_beneficiaries.find().forEach(function(doc) {
    var id = doc._id;
    var claims = db.mr_claims.findOne({"_id":id});
    var labs = db.mr_lab.findOne({"_id":id});
    db.singledocuments.insert({"userid":id,
                         "gender":doc.value.gender,
                         "dob":doc.value.dob,
                         "beneficiaries":doc.value.beneficiaries,
                         "claims":claims.value.claims,
                         "labs":labs.value.labs});
});