【问题标题】:Import of one to many relationships to mongodb将一对多关系导入到 mongodb
【发布时间】:2013-09-14 01:31:59
【问题描述】:

我在关系数据库中有大量数据要导入 Mongodb。数据存在于两个具有一对多关系的表中,因此我想安排最终的 mongo 集合将第二个表中的行存储为包含第一个表中数据的文档中的子文档。

使用 mongoimport,如果我使用 csv 格式(易于从原始数据库导出),我只能引入平面结构,否则我必须以具有完整嵌套结构的 json 格式从原始数据库导出(非常困难)

我尝试将每个表导入到不同的集合中,然后使用引用 here 的 map-reduce 技术,但这会导致顶级文档的字段被包裹在另一个不太令人满意的对象中。

我觉得这一定是一个非常常见的用例,但找不到任何关于如何解决它的指南。非常感谢任何帮助

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    你说得对,mongo 中的 map-reduce 假设一个键具有一个值文档——这就是为什么你最终得到的文档只有两个对象,一个键和一个(复杂的、嵌套的)值对象。

    您可以编写一些代码将 .csv 文件转换为 .json。

    或者,这里有一些技巧。我使用 mongoexport 将数据(使用 map-reduce 过程后)导出到 json,使用 sed 解压值对象,然后使用 将其导入回来mongoimport。如果使用管道,则无需随时保存整个文件(sed 是流式编辑器)。对于您引用的另一篇文章中的示例,您使用以下代码:

    mongoexport -c users_comments | sed 's/\"value\" : {//' | sed s/\}$// | mongoimport -c user_comments2
    

    这一行将复制 user_cmets 集合并将其存储在新集合 user_cmets2 中。如果您有更多磁盘空间,您可以保存导出文件并在导出后删除 user_cmets 集合,然后导入文件。它需要几行:

    mongoexport -c users_comments | sed 's/\"value\" : {//' | sed s/\}$// > export.json
    # now use mongo to drop the user_comments collection, and then:
    mongoimport -c user_comments < export.json
    

    假设 _id 不包含字符串“value”,并且您已经使用 mongoimport 导入了该数据,因此遭受了它所带来的任何数据丢失。我已经在小型数据集上对此进行了测试。我不会在实时生产数据库上推荐这种方法。

    【讨论】:

      猜你喜欢
      • 2014-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-12
      • 2015-10-25
      • 2018-11-02
      • 2019-08-23
      • 2016-01-17
      相关资源
      最近更新 更多