Я використовую синтаксис "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
Тепер ви можете помістити всі знаки долара у свій гередок, а знаки долара ігнорувати. Нижня сторона: це не працює, якщо вам потрібно ввести сценарій / змінні оболонки в сценарій mongo.
Ще один варіант, з яким можна пограти - це возитися зі своїм шебангом. Наприклад,
#!/bin/env mongo
<some mongo stuff>
Існує кілька проблем з цим рішенням:
Він працює лише в тому випадку, якщо ви намагаєтеся зробити скрипт оболонки mongo виконуваним з командного рядка. Ви не можете змішувати звичайні команди оболонки з командами оболонки mongo. І все, що ви економите, роблячи це - не потрібно вводити "монго" в командному рядку ... (звичайно, достатньо причини)
Він функціонує точно так само, як "mongo <some-js-file>", а це означає, що він не дозволяє вам використовувати команду "використовувати <db>".
Я спробував додати ім'я бази даних до shebang, що, на вашу думку, може спрацювати. На жаль, у тому, як система обробляє лінію shebang, все після першого пробілу передається як єдиний параметр (як би цитується) до команди env, і env не знаходить і не запускає її.
Натомість вам потрібно вбудувати зміну бази даних у сам сценарій, наприклад:
#!/bin/env mongo
db = db.getSiblingDB('<db>');
<your script>
Як і в усьому житті, "існує більше ніж один спосіб зробити це!"
.find()
операцій потрібно викликати операцію над результатом об'єкта для друку документів, таких якtoArray()
абоshellPrint()
. наприклад,mongo userdb --eval "printjson(db.users.find().toArray())"