对于10亿个文档,使用MongoDB将数据从一个字段填充到同一集合中的另一个字段

时间:2015-04-03 11:56:43

标签: ruby mongodb mongoid

我需要将数据从一个字段填充到同一个集合中的多个字段。例如: 目前我的文件如下:

 { _id: 1, temp_data: {temp1: [1,2,3], temp2: "foo bar"} }

我想在同一个集合中填入两个不同的字段,如下所示:

 { _id: 1, temp1: [1,2,3], temp2: "foo bar" }

我要迁移十亿个文档。请建议我更新所有10亿份文件的有效方法吗?

2 个答案:

答案 0 :(得分:2)

用您喜欢的语言编写一个贯穿所有文档的工具,迁移它们并将它们存储在新的数据库中。

一些提示:

  • 在迭代结果时,请确保它们已排序(例如在_id上),这样您就可以在迁移代码崩溃时实现简历...
  • 批量插入:读取,比方说,1000个项目,迁移它们,然后将1000个项目一次写入新数据库。读取会自动批处理。
  • 迁移后创建索引,而不是之前。这将更快,并导致更少的碎片

答案 1 :(得分:-1)

我在这里为您查询,使用以下查询来迁移您的数据

db.collection.find().forEach(function(myDoc) {
    db.collection_new.update(
    {_id: myDoc._id},
    {
        $unset: {'temp_data': 1},
        $set: {
            'temp1': myDoc.temp_data.temp1,
            'temp2': myDoc.temp_data.temp2
        }
    },
    { upsert: true }
    )
});

要了解有关foreach光标的更多信息,请访问link

需要 $ limit $ skip 运算符才能批量迁移数据。在更新查询中,我已经使用了upsert beacuse,如果已经存在,它将更新否则插入的条目将是新的。

由于