如何从`system.profile`集合中进行导出

3
我们正在尝试对性能进行分析,并已通过以下方式启用了分析功能:

> db.setProfilingLevel(0)

我们如何导出system.profile集合中的数据? 在执行以下命令后:
$ mongoexport --db test --collection system.profile --out export.json

I'm getting:

2016-06-15T10:26:09.723+0200    error validating settings: collection name 'system.profile' is not allowed to begin with 'system.'
2016-06-15T10:26:09.723+0200    try 'mongoexport --help' for more information

有什么办法可以做到吗?我确定我正在与mastermongod实例对抗,并且集合存在并包含数据。

我发现了以下问题(针对版本2.6),但显然在3.2.1中不起作用,因此我再次提问:从MongoDB导出system.profile不起作用

这是否在版本之间发生了变化?文档没有提及任何关于这种限制的内容,也没有任何官方解决方法。


你尝试过 mongodump --db test --collection system.profile --out /home/youruser/Desktop/ 吗?你可以为 --out 参数设置系统路径。 - Vishwas
是的,它可以工作,但我们的目标是最终得到 JSON 格式的数据。我已经找到了实现这一目标的方法。请查看我的回答。 - Teliatko
是的,但您没有提到您的解决方法。在提问时,您应该明确指定它。 - Vishwas
@Vishwas,我不明白,你指的是哪个解决方法?你是说我最终想要一个JSON吗?解决方法已经在答案中提到了,简单来说,无法严格遵循JSON格式。你必须编写一堆脚本。在我的情况下,只需要一个bash脚本。我还提到了可以使用bsondump来获取JSON。顺便说一句,很抱歉没有在一开始就提到我想要JSON。 - Teliatko
2个回答

3
个人资料数据存储在系统数据库中,无法使用mongoexport导出。
请创建一个JavaScript文件,添加内容并保存为ex.js。
profileData = db.system.profile.find();
while(profileData.hasNext()) {
  printjson(profileData.next());
}

然后使用以下命令运行你的MongoDB:
``` mongo hostName/databaseName ex.js > data.json ```

我接受你的问题,虽然它是其中一个可能的解决方案并且有效。但请参考我的答案。我回答了自己的问题以提供完整的选项列表。 - Teliatko
顺便提一下,你的脚本没有生成正确的JSON文档。因此,我重新构思了你的解决方案,以导出正确的JSON文档作为数组。这种解决方案的下一个问题是,当我尝试通过mongoimport重新导入时遇到了麻烦,但我仍然需要检查一下。也许在下一个问题中。 - Teliatko
@Teliatko - 感谢您的反馈 - 能否指出您的版本有哪些改进? - profesor79

1
我发现,这个问题有各种解决方案。我在这里总结所有的解决方案,为其他人提供决策的可能性。顺便说一下,在3.2版本中,mongoexport的行为是一个错误。
使用哪种方法取决于最终想要什么样的输出方式。我的意思是是否正确的JSON文档(严格),还是“Mongo Shell JSON”或BSON。有关Mongo语言中JSON之间的详细信息,请参阅documentation
通过“Mongo Shell JSON”,我的意思是文档写入文件,但整个文件并不对应严格的JSON格式,通常由Mongo工具如导入、导出产生/消耗。
第一种方法
输出BSON,然后输出“Mongo Shell JSON” 最简单的方法,正如Vishwas已经提到的,是使用mongodump
$ mongodump --host localhost:27017 --db test --collection system.profile

您可以使用--out [path]命令行参数来重定向转储的输出。然后,您将在{your out}/dump/test子文件夹中获得BSON格式的转储,例如system.profile.bson。只是提一下,dump子文件夹以{db}\{collection}.bson的形式组织。

要获取“Mongo Shell JSON”,您可以使用bsondump实用程序,如下所示:

$ cd dump/test 
$ bsondump system.profile.bson > system.profile.json

无法让bsondump以严格的JSON输出数据。生成的JSON文件是“Mongo Shell JSON”,文档就一个接一个地打印出来,不是作为JSON数组。如果要使其成为严格的JSON,则需要编写脚本将“Mongo Shell JSON”符号转换为严格的JSON符号,并使用,将记录分开并将它们包装在[]中。

第二点

另一种方法是由profesor79提到的方法,但稍微修改了一下,直接打印到JSON数组中。它直接打印到“Mongo Shell JSON”。

use test;
c = db.system.profile.find().sort({ ts: 1 });
separator = '';

print("[");
while(c.hasNext()) {
  print(separator);
  printjson(c.next());
  separator = ',';
}
print("]");

我在这里写下方便起见。如果您不需要一个数组,请使用 profesor79 答案中的片段。但仍需编写脚本将其转换为严格的 JSON 格式。
据我所知,没有直接获取严格 JSON 的方法。好消息是,即使 官方文档 中提到:

为了保留类型信息,mongoexport 和 mongoimport 对某些类型使用严格模式表示。

mongoimport 接受 "Mongo Shell JSON",因此我们目标是拥有严格的 JSON,以便在其他地方处理数据。目前,我们正在通过 bash 脚本导出 "Mongo Shell JSON",然后进行转换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接