Я использую синтаксис «heredoc», который упоминает Дэвид Янг. Но тут есть одна загвоздка
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
Вышеприведенное НЕ будет работать, потому что фраза «$ Существует» будет видна оболочкой и заменена значением переменной среды с именем «существует». Которого, скорее всего, не существует, поэтому после расширения оболочки оно становится:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { : true }
})
.forEach( printjson );
EOF
Чтобы пройти через него, у вас есть два варианта. Один уродлив, один довольно мил. Во-первых, уродливый: избежать знаков $:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { \$exists: true }
})
.forEach( printjson );
EOF
Я НЕ рекомендую это, потому что легко забыть о побеге.
Другой вариант - избежать EOF, например так:
#!/usr/bin/sh
mongo <db> <<\EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
Теперь вы можете поместить все знаки доллара в свой heredoc, и знаки доллара игнорируются. Обратная сторона: это не сработает, если вам нужно поместить параметры / переменные оболочки в ваш монго-скрипт.
Другой вариант, с которым вы можете поиграть, - связываться со своим шебангом. Например,
#!/bin/env mongo
<some mongo stuff>
Есть несколько проблем с этим решением:
Это работает, только если вы пытаетесь сделать скрипт оболочки mongo исполняемым из командной строки. Вы не можете смешивать обычные команды оболочки с командами оболочки Монго. И все, что вы сохраняете при этом, - это не вводить «mongo» в командной строке ... (конечно, достаточно причины)
Он работает точно так же, как «mongo <some-js-file>», что означает, что он не позволяет использовать команду «use <db>».
Я попытался добавить имя базы данных в shebang, который, как вы думаете, будет работать. К сожалению, то, как система обрабатывает строку Шебанга, все после первого пробела передается в виде отдельного параметра (как в кавычках) команде env, и env не может найти и запустить ее.
Вместо этого вы должны встроить изменение базы данных в сам скрипт, например так:
#!/bin/env mongo
db = db.getSiblingDB('<db>');
<your script>
Как и во всем в жизни, «есть более чем один способ сделать это!»
.find()
операций необходимо вызвать операцию для объекта результата для печати документов, напримерtoArray()
илиshellPrint()
. например,mongo userdb --eval "printjson(db.users.find().toArray())"