2012-10-27 107 views

回答

171

Shell提供了一些不错的,但隐藏的功能,因为它是一个互动的环境。

当通过蒙戈commands.js你不会得到相当一致的行为您从一个JavaScript文件的命令。

有两种解决方法。

(1)假出壳并使其觉得你是在交互模式

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


(2)使用JavaScript一个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 
+0

我得到加载失败command.js –

+0

command.js必须是一个可读的文件,存在于当前目录中,并且具有要运行的JavaScript。 –

+0

如何为远程mongo数据库执行此操作?我试过'mongo blah.mongolab.com:33478/blah -u user -p pass --eval“我的查询”>> dump.txt',但它给了我'JavaScript执行失败:SyntaxError:意外的标记ILLEGAL'。 – Sheharyar

12

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

./mongo foo find.js >> out.json 
+0

这并没有为我工作,只印了外壳版本和db名'out.json'。 'mongo foo < find.js > out.json'确实有效。 –

+1

这个答案写在工具围棋被改写之前,许多版本前,除非你使用很老的东西,那么这可能是为什么它不为你工作 –

26

因为你是一个终端上,只是这样做希望在一个健全的方式来检查的记录,你可以使用一个小技巧是这样的:

mongo | tee somefile 

使用会话正常 - db.collection.find().pretty()或任何你需要做的,忽略了长时间的输出,并退出。您的会话记录将在文件tee写信给。

要留意的是,输出可能包含转义序列和其他垃圾由于蒙戈外壳期待的交互式会话。 less优雅地处理这些。

7

把你的查询(例如db.someCollection.find().pretty())的JavaScript文件,比方说query.js。然后在你的操作系统的shell命令使用运行它:

mongo yourDb <query.js> outputFile

查询结果将被命名为“OUTPUTFILE”的文件中。

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

DBQuery.shellBatchSize = 100

+0

这个。不要被'.js'扩展名误导。你可以编写所有这些漂亮的mongo shell查询,而不用改变它们。 –

2

从阿霞甘维珍使用这个answer,我写了一个单行蝙蝠脚本的Windows。该生产线是这样的:

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

然后一个可以运行它:

exportToJson.bat DbName CollectionName

2

使用printJSON.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() 
); 

希望这有助于!

0

也有mongoexport对于这一点,但我不知道,因为它的版本可用。

例子:

mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json