106

具体来说,我想将 mongodb 的结果打印find()到文件中。JSON 对象太大,因此我无法使用 shell 窗口大小查看整个对象。

4

11 回答 11

228

Shell 提供了一些不错但隐藏的特性,因为它是一个交互式环境。

当您通过 mongo commands.js 从 javascript 文件运行命令时,您不会得到完全相同的行为。

有两种方法可以解决这个问题。

(1) 伪造外壳,让它认为你处于交互模式

$ mongo dbname << EOF > output.json
db.collection.find().pretty()
EOF


(2) 使用 Javascript 将 a 的结果find()转换为可打印的 JSON

mongo dbname command.js > output.json

其中 command.js 包含此(或其等效项):

printjson( db.collection.find().toArray() )

这将漂亮地打印结果数组,包括[ ]- 如果您不希望您可以迭代数组和printjson()每个元素。

顺便说一句,如果您只运行一个 Javascript 语句,则不必将其放入文件中,而是可以使用:

$ mongo --quiet dbname --eval 'printjson(db.collection.find().toArray())' > output.json
于 2012-10-28T17:16:13.067 回答
30

由于您是在终端上执行此操作并且只想以理智的方式检查记录,因此您可以使用以下技巧:

mongo | tee somefile

正常使用会话 -db.collection.find().pretty()或任何您需要做的事情,忽略长输出,然后退出。您的会话记录将在tee写入的文件中。

请注意,由于 mongo shell 需要交互式会话,因此输出可能包含转义序列和其他垃圾。 less优雅地处理这些。

于 2014-05-23T21:34:57.010 回答
13

只需将要运行的命令放入文件中,然后将其与数据库名称一起传递给 shell,并将输出重定向到文件中。所以,如果你的 find 命令在find.js并且你的数据库是foo,它看起来像这样:

./mongo foo find.js >> out.json
于 2012-10-28T00:26:37.960 回答
11

将您的查询(例如db.someCollection.find().pretty())放到一个 javascript 文件中,比如说query.js. 然后使用以下命令在操作系统的 shell 中运行它:

mongo yourDb < query.js > outputFile

查询结果将在名为“outputFile”的文件中。

默认情况下,Mongo 会打印出前 20 个文档 IIRC。如果您想要更多,您可以在 Mongo shell 中为批量大小定义新值,例如

DBQuery.shellBatchSize = 100.

于 2016-08-16T09:09:21.170 回答
6

我设法用writeFile()函数保存了结果。

> writeFile("/home/pahan/output.txt", tojson(db.myCollection.find().toArray()))

Mongo shell 版本是 4.0.9

于 2019-05-08T21:26:31.297 回答
6

使用printandJSON.stringify你可以简单地产生一个有效 JSON的结果。
使用--quietflag 从输出中过滤外壳噪声。
使用--norc标志来避免.mongorc.js评估。(我不得不这样做,因为我使用了一个漂亮的格式化程序,它会产生无效的 JSON输出)使用DBQuery.shellBatchSize = ?替换?实际结果的限制来避免分页。

最后,用于tee将终端输出通过管道传输到文件:

// Shell:
mongo --quiet --norc ./query.js | tee ~/my_output.json

// query.js:
DBQuery.shellBatchSize = 2000;
function toPrint(data) {
  print(JSON.stringify(data, null, 2));
}

toPrint(
  db.getCollection('myCollection').find().toArray()
);

希望这可以帮助!

于 2017-10-07T19:40:38.753 回答
2

使用 Asya Kamsky 的这个答案,我为 Windows 编写了一个单行 bat 脚本。该行如下所示:

mongo --quiet %1 --eval "printjson(db.%2.find().toArray())" > output.json

然后可以运行它:

exportToJson.bat DbName CollectionName

于 2016-08-23T09:27:49.223 回答
1

Neodan mongoexport 的回答-q对于查询选项非常有用。它还转换ObjectId为 JSON 的标准格式"$oid"。例如:

mongoexport -d yourdb -c yourcol --jsonArray --pretty -q '{"field": "filter value"}' -o output.json
于 2018-06-07T03:09:21.990 回答
1

在新的mongodb shell 5.0+ mongosh中,它集成了Node.js fs 模块,因此您可以在新的mongosh shell 中简单地执行以下操作以漂亮地打印输出:

fs.writeFileSync('output.json', JSON.stringify(db.test.find().toArray(), null, 2))

没有任何问题,如ObjectId被剥离等,比printjsonor好.pretty()

上面的代码可以按照描述的方式工作:

MongoDB Shell mongosh 是一个功能齐全的 JavaScript 和 Node.js 14.x REPL环境,用于与 MongoDB 部署进行交互。您可以使用 MongoDB Shell 直接使用您的数据库测试查询和操作。

旧的mongoshell 也被标记为Legacy,所以你应该转向这种新的方式。

于 2021-12-29T02:08:13.523 回答
1

也有mongoexport,但我不确定它是可用的版本。

例子:

mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json
于 2017-11-23T08:47:39.370 回答
0

您可以使用此命令来实现它:

mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > output.json

于 2020-06-08T12:29:18.137 回答