2012-10-27 108 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