Apakah ada cara untuk 'cantik' mencetak keluaran shell MongoDB ke file?

101

Secara khusus, saya ingin mencetak hasil mongodb find()ke file. Objek JSON terlalu besar sehingga saya tidak dapat melihat keseluruhan objek dengan ukuran jendela shell.

ular berbisa
sumber

Jawaban:

216

Shell menyediakan beberapa fitur bagus tetapi tersembunyi karena ini adalah lingkungan yang interaktif.

Saat Anda menjalankan perintah dari file javascript melalui mongo commands.js, Anda tidak akan mendapatkan perilaku yang cukup identik.

Ada dua cara untuk mengatasi ini.

(1) berpura-pura cangkang dan membuatnya berpikir Anda dalam mode interaktif

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

atau
(2) gunakan Javascript untuk menerjemahkan hasil dari a find()menjadi JSON yang dapat dicetak

mongo dbname command.js > output.json

di mana command.js berisi ini (atau yang setara):

printjson( db.collection.find().toArray() )

Ini cukup mencetak larik hasil, termasuk [ ]- jika Anda tidak ingin Anda dapat mengulang larik dan printjson()setiap elemen.

Omong-omong, jika Anda menjalankan hanya satu pernyataan Javascript, Anda tidak perlu memasukkannya ke dalam file dan sebagai gantinya Anda dapat menggunakan:

$ mongo --quiet dbname --eval 'printjson(db.collection.find().toArray())' > output.json
Asya Kamsky
sumber
command.js harus berupa file yang dapat dibaca yang ada di direktori Anda saat ini dan yang memiliki javascript yang ingin Anda jalankan.
Asya Kamsky
Bagaimana cara melakukannya untuk mongo db jarak jauh? Saya mencoba mongo blah.mongolab.com:33478/blah -u user -p pass --eval "my query" >> dump.txttetapi itu memberi saya JavaScript execution failed: SyntaxError: Unexpected token ILLEGAL.
Sheharyar
kesalahan itu berarti apa yang ada di dalam tanda kutip Anda setelah --eval bukan sintaks hukum. Saya merekomendasikan menggunakan tanda kutip tunggal di luar seluruh ekspresi dan jika Anda membutuhkan tanda kutip di dalamnya gunakan tanda kutip ganda untuk itu.
Asya Kamsky
2
Opsi 2 benar-benar satu-satunya opsi jika Anda memiliki lebih dari segelintir hasil, karena pada opsi 1 hanya akan berhenti di 'Ketik "untuk lebih banyak".
Tomty
2
tidak benar-benar @Tomty - ukuran batch shell dapat dikontrol dengan variabel di dalam shell. Anda dapat meletakkan DBQuery.shellBatchSize = 10000 ke dalam file .mongodbrc.js Anda dan itu akan "berhenti" setelah 10000 hasil, bukan 20.
Asya Kamsky
29

Karena Anda melakukan ini di terminal dan hanya ingin memeriksa record dengan cara yang waras, Anda dapat menggunakan trik seperti ini:

mongo | tee somefile

Gunakan sesi seperti biasa - db.collection.find().pretty()atau apa pun yang perlu Anda lakukan, abaikan output panjang, dan keluar. Transkrip sesi Anda akan ada di file yang teeditulis ke.

Perhatikan bahwa keluaran mungkin berisi urutan pelolosan dan sampah lainnya karena mongo shell mengharapkan sesi interaktif. lessmenangani ini dengan anggun.

Falcon Momot
sumber
12

Cukup letakkan perintah yang ingin Anda jalankan ke dalam file, lalu teruskan ke shell bersama dengan nama database dan arahkan output ke file. Jadi, jika perintah find Anda ada di dalam find.jsdan database Anda foo, akan terlihat seperti ini:

./mongo foo find.js >> out.json
Adam Comerford
sumber
Ini tidak berhasil untuk saya, hanya mencetak versi shell dan nama db ke out.json. mongo foo < find.js > out.jsonberhasil.
James Brown
1
jawaban ini ditulis sebelum alat itu ditulis ulang di Go dan banyak versi yang lalu, kecuali jika Anda menggunakan sesuatu yang sangat tua, maka itu mungkin mengapa itu tidak bekerja untuk Anda
Adam Comerford
10

Letakkan kueri Anda (misalnya db.someCollection.find().pretty()) ke file javascript, katakanlah query.js. Kemudian jalankan di shell sistem operasi Anda menggunakan perintah:

mongo yourDb < query.js > outputFile

Hasil kueri akan berada di file bernama 'outputFile'.

Secara default Mongo mencetak 20 dokumen pertama IIRC. Jika Anda ingin lebih, Anda dapat menentukan nilai baru untuk ukuran batch di shell Mongo, misalnya

DBQuery.shellBatchSize = 100.

JohnP
sumber
Ini. Jangan salah arah dengan .jsekstensi. Anda dapat menulis semua kueri mongo shell yang bagus tanpa mengubahnya sama sekali.
M
4

Menggunakan printdan JSON.stringifyAnda dapat dengan mudah menghasilkan hasil yang valid JSON .
Gunakan --quiettanda untuk memfilter kebisingan shell dari keluaran.
Gunakan --norcbendera untuk menghindari .mongorc.jsevaluasi. (Saya harus melakukannya karena formatter-cantik yang saya gunakan, yang menghasilkan keluaran JSON yang tidak valid ) Gunakan DBQuery.shellBatchSize = ?penggantian ?dengan batas hasil sebenarnya untuk menghindari paging.

Dan terakhir, gunakan teeuntuk menyalurkan output terminal ke file:

// 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()
);

Semoga ini membantu!

Dmitry
sumber
2

Menggunakan jawaban dari Asya Kamsky ini, saya menulis skrip bat satu baris untuk Windows. Garisnya terlihat seperti ini:

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

Kemudian seseorang dapat menjalankannya:

exportToJson.bat DbName CollectionName

margaretkru.dll
sumber
2

Saya berhasil menyimpan hasil dengan fungsi writeFile () .

> writeFile("/home/pahan/output.txt", tojson(db.myCollection.find().toArray()))

Versi shell Mongo adalah 4.0.9

Pavel_H
sumber
1

Juga ada mongoexport untuk itu, tapi saya tidak yakin sejak versi mana itu tersedia.

Contoh:

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

Sebagai jawaban oleh Neodan mongoexport cukup berguna dengan -qopsi untuk kueri. Itu juga dikonversi ObjectIdke format standar JSON "$oid". Misalnya:

mongoexport -d yourdb -c yourcol --jsonArray --pretty -q '{"field": "filter value"}' -o output.json
Nhan D Le
sumber
0

Anda dapat menggunakan perintah ini untuk mencapainya:

mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > output.json

Parimal Jana
sumber