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.
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.
Jawaban:
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
mongo blah.mongolab.com:33478/blah -u user -p pass --eval "my query" >> dump.txt
tetapi itu memberi saya JavaScript execution failed: SyntaxError: Unexpected token ILLEGAL
.
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 tee
ditulis ke.
Perhatikan bahwa keluaran mungkin berisi urutan pelolosan dan sampah lainnya karena mongo shell mengharapkan sesi interaktif. less
menangani ini dengan anggun.
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.js
dan database Anda foo
, akan terlihat seperti ini:
./mongo foo find.js >> out.json
out.json
. mongo foo < find.js > out.json
berhasil.
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
.
.js
ekstensi. Anda dapat menulis semua kueri mongo shell yang bagus tanpa mengubahnya sama sekali.
Menggunakan print
dan JSON.stringify
Anda dapat dengan mudah menghasilkan hasil yang valid JSON
.
Gunakan --quiet
tanda untuk memfilter kebisingan shell dari keluaran.
Gunakan --norc
bendera untuk menghindari .mongorc.js
evaluasi. (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 tee
untuk 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!
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
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
Anda dapat menggunakan perintah ini untuk mencapainya:
mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > output.json