Answers:
Shell提供了一些不错的但隐藏的功能,因为它是一个交互式环境。
当您通过mongocommands.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 blah.mongolab.com:33478/blah -u user -p pass --eval "my query" >> dump.txt
但是给了我JavaScript execution failed: SyntaxError: Unexpected token ILLEGAL
。
只需将要运行的命令放入文件中,然后将其与数据库名称一起传递到外壳并将输出重定向到文件。因此,如果您的find命令位于find.js
并且数据库为foo
,则它将看起来像这样:
./mongo foo find.js >> out.json
out.json
。mongo foo < find.js > out.json
做过。
db.someCollection.find().pretty()
假设您的查询(例如)到一个javascript文件query.js
。然后使用以下命令在操作系统的外壳中运行它:
mongo yourDb < query.js > outputFile
查询结果将在名为“ outputFile”的文件中。
默认情况下,Mongo会打印出前20个文档IIRC。如果需要更多,可以在Mongo Shell中为批次大小定义新值,例如
DBQuery.shellBatchSize = 100
。
.js
扩展误导。您可以编写所有这些不错的mongo shell查询,而无需完全更改它们。
使用print
和JSON.stringify
您可以简单地产生有效的 JSON
结果。
使用--quiet
标志过滤输出中的外壳噪声。
使用--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()
);
希望这可以帮助!
也有针对此的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