2

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

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

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

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

4

1 回答 1

0

你是对的,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_comments 集合并将其存储在一个新集合 user_comments2 中。如果您有更多磁盘空间,您可以保存导出文件并在导出后删除 user_comments 集合,然后导入文件。它需要几行:

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 导入了该数据,因此遭受了它所带来的任何数据丢失。我已经在小型数据集上对此进行了测试。我不会在实时生产数据库上推荐这种方法。

于 2013-09-13T17:31:59.770 回答