[英]Is there a way to 'pretty' print MongoDB shell output to a file?
具體來說,我想將 mongodb find()
的結果打印到文件中。 JSON 對象太大,因此我無法使用外殼窗口大小查看整個對象。
shell 提供了一些不錯但隱藏的功能,因為它是一個交互式環境。
當您通過 mongo 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
由於您在終端上執行此操作並且只想以理智的方式檢查記錄,您可以使用這樣的技巧:
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
。
使用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()
);
希望這可以幫助!
我設法用writeFile()函數保存了結果。
> writeFile("/home/pahan/output.txt", tojson(db.myCollection.find().toArray()))
Mongo shell 版本是 4.0.9
使用 Asya Kamsky 的這個答案,我為 Windows 編寫了一個單行 bat 腳本。 該行如下所示:
mongo --quiet %1 --eval "printjson(db.%2.find().toArray())" > output.json
然后可以運行它:
exportToJson.bat DbName CollectionName
也有mongoexport ,但我不確定它是哪個版本可用。
例子:
mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json
Neodan mongoexport 的回答對於查詢-q
選項非常有用。 它還將ObjectId
轉換為 JSON "$oid"
標准格式。 例如:
mongoexport -d yourdb -c yourcol --jsonArray --pretty -q '{"field": "filter value"}' -o output.json
您可以使用此命令來實現它:
mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > 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
或.pretty()
。
上面的代碼可以像描述一樣工作:
MongoDB Shell mongosh 是一個功能齊全的 JavaScript 和 Node.js 14.x REPL環境,用於與 MongoDB 部署進行交互。 您可以使用 MongoDB Shell 直接對數據庫測試查詢和操作。
舊的mongo
shell 也標記為Legacy 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.