我在关系数据库中有大量数据要导入Mongodb。数据存在于两个具有一对多关系的表中,因此我希望安排最终的mongo集合将第二个表中的行存储为包含第一个表中数据的文档中的子文档。
使用mongoimport我只能使用csv格式(易于从原始数据库导出)引入平面结构,否则我必须使用完整的嵌套结构从原始数据库导出json格式(非常难)
我尝试将每个表导入到不同的集合中,然后使用引用here的map-reduce技术,但这会导致顶级文档的字段被包装在另一个不太令人满意的对象中。< / p>
我觉得这必须是一个非常常见的用例,但找不到任何有关如何解决它的指南。任何帮助非常感谢
答案 0 :(得分: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导入该数据,因此遭受了任何数据丢失。我在小数据集上测试了这个。我不建议在实时生产数据库上使用这种方法。