具体来说,我想将 mongodb 的结果打印find()
到文件中。JSON 对象太大,因此我无法使用 shell 窗口大小查看整个对象。
11 回答
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
由于您是在终端上执行此操作并且只想以理智的方式检查记录,因此您可以使用以下技巧:
mongo | tee somefile
正常使用会话 -db.collection.find().pretty()
或任何您需要做的事情,忽略长输出,然后退出。您的会话记录将在tee
写入的文件中。
请注意,由于 mongo shell 需要交互式会话,因此输出可能包含转义序列和其他垃圾。 less
优雅地处理这些。
只需将要运行的命令放入文件中,然后将其与数据库名称一起传递给 shell,并将输出重定向到文件中。所以,如果你的 find 命令在find.js
并且你的数据库是foo
,它看起来像这样:
./mongo foo find.js >> out.json
将您的查询(例如db.someCollection.find().pretty()
)放到一个 javascript 文件中,比如说query.js
. 然后使用以下命令在操作系统的 shell 中运行它:
mongo yourDb < query.js > outputFile
查询结果将在名为“outputFile”的文件中。
默认情况下,Mongo 会打印出前 20 个文档 IIRC。如果您想要更多,您可以在 Mongo shell 中为批量大小定义新值,例如
DBQuery.shellBatchSize = 100
.
我设法用writeFile()函数保存了结果。
> writeFile("/home/pahan/output.txt", tojson(db.myCollection.find().toArray()))
Mongo shell 版本是 4.0.9
使用print
andJSON.stringify
你可以简单地产生一个有效 JSON
的结果。
使用--quiet
flag 从输出中过滤外壳噪声。
使用--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()
);
希望这可以帮助!
使用 Asya Kamsky 的这个答案,我为 Windows 编写了一个单行 bat 脚本。该行如下所示:
mongo --quiet %1 --eval "printjson(db.%2.find().toArray())" > output.json
然后可以运行它:
exportToJson.bat DbName CollectionName
Neodan mongoexport 的回答-q
对于查询选项非常有用。它还转换ObjectId
为 JSON 的标准格式"$oid"
。例如:
mongoexport -d yourdb -c yourcol --jsonArray --pretty -q '{"field": "filter value"}' -o output.json
在新的mongodb shell 5.0+ mongosh中,它集成了Node.js fs 模块,因此您可以在新的mongosh shell 中简单地执行以下操作以漂亮地打印输出:
fs.writeFileSync('output.json', JSON.stringify(db.test.find().toArray(), null, 2))
没有任何问题,如ObjectId
被剥离等,比printjson
or好.pretty()
。
上面的代码可以按照描述的方式工作:
MongoDB Shell mongosh 是一个功能齐全的 JavaScript 和 Node.js 14.x REPL环境,用于与 MongoDB 部署进行交互。您可以使用 MongoDB Shell 直接使用您的数据库测试查询和操作。
旧的mongo
shell 也被标记为Legacy,所以你应该转向这种新的方式。
也有mongoexport,但我不确定它是可用的版本。
例子:
mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json
您可以使用此命令来实现它:
mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > output.json