mongodb 从bsondump导出的json创建对象数组

lsmepo6l  于 2023-03-29  发布在  Go
关注(0)|答案(2)|浏览(120)

我使用bsondump将一个巨大的(69 GB)文件导出到json。我希望得到一个有效的json数组,但相反,对象没有分开。
有一个使用mongoexport创建json数组的选项。但是这个bson文件是从另一台机器导出的,出于大小和性能的考虑,我不想在使用mongoexport从数据库导出之前导入这个大文件。
如何使用bsondump导出有效的JSON数组?

编辑

为了给予更多的背景,为什么我需要从基于bson的mongodb导出转换为json:
1)我试着用mongoexport直接从mongodb导出一个json,就像这样:

mongoexport -d mydb -c notifications --jsonArray -o lv.json

这样做的问题是没有可用的导出进度,并且它的运行速度明显比mongodump慢(例如,在我不得不停止之前,它从未完成)。我给生产服务器带来了很大的压力。正如我在最初的问题中所说的那样,这不是一个选择。
2)mongodump运行得更快,可能是因为它不必转换为json,只需转储内部数据。它还显示进度,所以我知道它什么时候会完成。所以这是我唯一可以在生产服务器上运行的东西。

mongodump --db mydb

编辑2

导出为.bson后,可以使用bsondump将.bson文件转换为.json文件:

bsondump mydata.bson > mydata.json

在这里把这一点说清楚:bsondump没有像mongoexport那样的--jsonArray选项。所以它不能导出有效的json数组,而是将多个根对象转储到一个文件中。结果是一个无效的文档,必须预先解析。

/编辑2

3)我基本上有两个选择:将bson转储导入本地数据库,并使用mongoexport --jsonArray将其导出到适当的json文件。或者找到一种方法绕过bsondump本身无法导出到适当的json数组文件。第三种选择,将bson解析器实现到我的工具中,这是我不太热衷的事情...
大文件大小对我的工具来说不是问题。我的工具是用C++编写的,专门用于大数据流。我使用rapidjson和SAX解析器,并通过自己的SQL类求值器过滤记录。内存使用通常在〈10 MB的区域,因为我使用SAX解析器而不是DOM。

omhiaaxx

omhiaaxx1#

回答我自己的问题:bsondump目前缺少创建json数组作为输出的选项(像mongoexport的--jsonArray选项)。我已经创建了一个功能请求[1],也许它会被添加到下一个版本的bsondump中。
与此同时,我创建了一个小工具,用于将我的数据转换为json数组。
[1][https://jira.mongodb.org/browse/TOOLS-1734](https://jira.mongodb.org/browse/TOOLS-1734)

jhdbpxl9

jhdbpxl92#

我使用这个linux命令将无效的json转换为有效的json:

sed -i -e '1s/^/[/' -e ':a;N;$!ba;s/\n/,/g' -e '$s/$/]/' dump.json

请小心,因为此命令修改文件,因此在副本上执行它

相关问题