簡體   English   中英

有沒有辦法“漂亮”地將 MongoDB shell 輸出打印到文件中?

[英]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

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

希望這可以幫助!

我設法用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM