Saya menggunakan sintaks "heredoc", yang David Young sebutkan. Tapi ada yang menangkap:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
Di atas TIDAK akan berfungsi, karena frasa "$ ada" akan terlihat oleh shell dan diganti dengan nilai variabel lingkungan bernama "ada." Yang, sepertinya, tidak ada, jadi setelah ekspansi shell, itu menjadi:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { : true }
})
.forEach( printjson );
EOF
Agar dapat melewati Anda memiliki dua opsi. Satu jelek, satu cukup bagus. Pertama, yang jelek: lepas tanda $:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { \$exists: true }
})
.forEach( printjson );
EOF
Saya TIDAK merekomendasikan ini, karena mudah lupa untuk melarikan diri.
Opsi lainnya adalah keluar dari EOF, seperti ini:
#!/usr/bin/sh
mongo <db> <<\EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
Sekarang, Anda dapat meletakkan semua tanda dolar yang Anda inginkan di heredoc Anda, dan tanda dolar diabaikan. Sisi bawah: Itu tidak berfungsi jika Anda perlu meletakkan parameter / variabel shell di skrip mongo Anda.
Opsi lain yang bisa Anda mainkan adalah mengacaukan shebang Anda. Sebagai contoh,
#!/bin/env mongo
<some mongo stuff>
Ada beberapa masalah dengan solusi ini:
Ini hanya berfungsi jika Anda mencoba membuat skrip shell mongo dapat dieksekusi dari baris perintah. Anda tidak dapat mencampur perintah shell biasa dengan perintah shell mongo. Dan semua yang Anda hemat dengan melakukannya adalah tidak harus mengetikkan "mongo" pada baris perintah ... (cukup alasan, tentu saja)
Fungsinya persis seperti "mongo <some-js-file>" yang artinya tidak membiarkan Anda menggunakan perintah "use <db>".
Saya telah mencoba menambahkan nama database ke shebang, yang menurut Anda akan berhasil. Sayangnya, cara sistem memproses garis shebang, semuanya setelah spasi pertama dilewatkan sebagai parameter tunggal (seperti dikutip) ke perintah env, dan env gagal menemukan dan menjalankannya.
Sebagai gantinya, Anda harus menyematkan perubahan database di dalam skrip itu sendiri, seperti:
#!/bin/env mongo
db = db.getSiblingDB('<db>');
<your script>
Seperti halnya apa pun dalam hidup, "ada lebih dari satu cara untuk melakukannya!"
.find()
operasi, Anda perlu memanggil operasi pada objek hasil untuk mencetak dokumen, sepertitoArray()
ataushellPrint()
. misalnya,mongo userdb --eval "printjson(db.users.find().toArray())"