Как выполнять команды монго через скрипты оболочки?

251

Я хочу выполнить команды mongo в оболочке script.

Я пробовал следующий путь test.sh

#!/bin/sh

mongo myDbName

db.mycollection.findOne()

show collections

Когда я выполняю над script./test.sh

Затем установлено соединение mongo, но следующие команды не выполнены

Как выполнять другие команды через sh script [test.sh]?

Пожалуйста, помогите мне

Теги:
sh

16 ответов

297
Лучший ответ

Вы также можете оценить команду, используя флаг --eval, если это всего лишь одна команда.

mongo --eval "printjson(db.serverStatus())"

Обратите внимание:, если вы используете Mongo-операторы, начиная с знака $, вам нужно окружить аргумент eval в одинарных кавычках, чтобы оболочка не оценивала оператор как переменную среды

mongo --eval 'db.test.update({"name":"foo"},{$set:{"this":"that"}});'

В противном случае вы можете увидеть что-то вроде этого:

mongo --eval "db.test.update({\"name\":\"foo\"},{$set:{\"this\":\"that\"}});"
> E QUERY    SyntaxError: Unexpected token :
  • 28
    Для .find() необходимо вызвать операцию для объекта результата для печати документов, например toArray() или shellPrint() . например, mongo userdb --eval "printjson(db.users.find().toArray())"
  • 4
    Я должен был указать строку подключения, например, mongo <ip>: <port> / db --eval "printjson (db.serverStatus ())" или mongo <ip>: <port> / db <mongoCommands.js, чтобы предотвратить его всегда подключаться к «тесту»
Показать ещё 9 комментариев
207

Поместите свой mongo script в файл .js.

Затем выполните mongo < yourFile.js

Пример:

demo.js//файл имеет ваш script

use sample  //db name
show collections

сохраните этот файл в "c:\db-scripts"

Затем в приглашении cmd перейдите к "c:\db-scripts"

C:\db-scripts>mongo < demo.js

Это приведет к выполнению кода в mongo и отобразит вывод

C:\db-scripts>mongo < demo.js
Mongo shell version: 3.0.4
Connecting to: test
switched to db sample
users   //collection name
tasks   //collection name
bye
C:\db-scripts>
  • 12
    В буквальном смысле слова ... вы берете те же самые команды, которые вводите в оболочку mongo, сохраняете эти команды в файле .js и передаете их в качестве параметра команде mongo .
  • 7
    Стоит отметить, что все, что вы задали в операторе --eval (если он указан) для интерпретатора mongo, останется в области действия при выполнении вашего скрипта (если он есть). Вы можете использовать это, чтобы сделать ваши сценарии более пригодными для повторного использования, например. mongo --eval "somevar = 'someval';" db_name script_that_uses_somevar.js
Показать ещё 6 комментариев
86

Это работает для меня под Linux:

mongo < script.js
  • 0
    Конечно, это не обязательно файл .js.
  • 0
    работает даже на окнах
Показать ещё 1 комментарий
46

Поместите это в файл с именем test.js:

db.mycollection.findOne()
db.getCollectionNames().forEach(function(collection) {
  print(collection);
});

затем запустите его с помощью mongo myDbName test.js.

  • 1
    Как передать значения в скрипт из bash? Я хочу вставить имя в БД, которая доступна в Bash в качестве переменной, и я хочу передать его в скрипт (JS)
  • 0
    Это работало в PowerShell
28

Здесь есть страница официальная документация об этом.

Примеры из этой страницы:

mongo server:27017/dbname --quiet my_commands.js
mongo test --eval "printjson(db.getCollectionNames())"
20

Оболочка script ниже также хорошо работала для меня... определенно пришлось использовать перенаправление, о котором упоминал Антонин вначале... это дало мне идею протестировать здесь документ.

function testMongoScript {
    mongo <<EOF
    use mydb
    db.leads.findOne()
    db.leads.find().count()
EOF
}
  • 10
    Отличный ответ! Для нескольких команд это также работает: echo -e "use mydb\ndb.leads.findOne()\ndb.leads.find().count()" | mongo
  • 0
    Определенно полезно, потому что вы не можете использовать «использовать mydb» в файле JS.
Показать ещё 2 комментария
16

В моей настройке я должен использовать:

mongo --host="the.server.ip:port" databaseName theScript.js 
  • 3
    Спасибо за флаг имени хоста
  • 4
    +1 для databaseName :)
11

Как насчет этого:

echo "db.mycollection.findOne()" | mongo myDbName
echo "show collections" | mongo myDbName
  • 1
    Или чуть более читабельно: echo "db.mycollection.findOne ()" | Монго myDbName --quiet | python -m json.tool
  • 0
    Это полезно выполнить что - то после того, как .mongorc был загружен ( docs.mongodb.org/manual/reference/program/mongo/... )
10

Я использую синтаксис "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, а знаки доллара игнорируются. Нижняя сторона: это не работает, если вам нужно поместить параметры/переменные оболочки в свой mongo script.

Еще один вариант, с которым вы можете играть, - это возиться со своим shebang. Например,

#!/bin/env mongo
<some mongo stuff>

Есть несколько проблем с этим решением:

  • Он работает только в том случае, если вы пытаетесь сделать из командной строки оболочку mongo script. Вы не можете смешивать обычные команды оболочки с командами оболочки mongo. И все, что вы сохраняете, не нужно набирать "манго" в командной строке... (конечно, разумно).

  • Он функционирует точно так же, как "mongo < some-js-file > "; что означает, что он не позволяет вам использовать "use <db> "; команда.

Я попытался добавить имя базы данных в shebang, что, по вашему мнению, будет работать. К сожалению, система обрабатывает строку shebang, все после первого пробела передается в качестве единственного параметра (как если бы он цитируется) команде env, а env не находит и не запускает его.

Вместо этого вам необходимо встроить изменение базы данных внутри самого script, например:

#!/bin/env mongo
db = db.getSiblingDB('<db>');
<your script>

Как и в любом случае в жизни, "есть более чем один способ сделать это!"

  • 0
    Это работает для меня: #! / Usr / bin / mongo <db_name>
  • 0
    Кто-нибудь, как использовать переменную, определенную в сценарии оболочки внутри Монго похвалы ..?
7

Как было предложено theTuxRacer, вы можете использовать команду eval, для тех, кто ее пропускает, как я был, вы также можете добавить свое имя db, если вы не пытаетесь выполнить операцию предварительной обработки по умолчанию db.

mongo <dbname> --eval "printjson(db.something.find())"
  • 2
    спасибо, что <dbname> часть команды <dbname> :)
7

Спасибо printf! В среде Linux здесь лучше всего будет показывать только один файл. Скажем, у вас есть два файла, mongoCmds.js с несколькими командами:

use someDb
db.someColl.find()

а затем файл оболочки драйвера, runMongoCmds.sh

mongo < mongoCmds.js

Вместо этого, у вас есть только один файл, runMongoCmds.sh содержащий

printf "use someDb\ndb.someColl.find()" | mongo

Bash printf гораздо более надежный, чем echo, и позволяет \n между командами принудительно их на несколько строк.

3

Создайте файл script; написать команды:

#!/bin/sh
mongo < file.js

В file.js напишите свой запрос mongo:

db.collection.find({"myValue":null}).count();
3

Если включена аутентификация:

mongo -u username -p password --authenticationDatabase auth_db_name < your_script.js
3

- флаг флага также может использоваться для файлов javascript

 mongo --shell /path/to/jsfile/test.js 
  • 0
    Я думаю, что это просто оставляет оболочку открытой после выполнения JS? mongo /path/to/jsfile/test.js будет выдавать js.
2
mongo db_name --eval "db.user_info.find().forEach(function(o) {print(o._id);})"
0

Недавно перенесено из mongodb в Postgres. Вот как я использовал скрипты.

mongo < scripts.js > inserts.sql

Считать scripts.js и перенаправить вывод на inserts.sql.

scripts.js выглядит следующим образом

use myDb;
var string = "INSERT INTO table(a, b) VALUES";
db.getCollection('collectionName').find({}).forEach(function (object) {
    string += "('" + String(object.description) + "','" + object.name + "'),";
});
print(string.substring(0, string.length - 1), ";");

inserts.sql выглядит следующим образом

INSERT INTO table(a, b) VALUES('abc', 'Alice'), ('def', 'Bob'), ('ghi', 'Claire');
  • 0
    Очень интересно, но не по теме относительно исходного вопроса.
  • 0
    How to execute mongo commands through shell scripts? Это не по теме. На самом деле я дошел до этого вопроса благодаря названию. Таким людям, как я, полезно читать такой ответ. Кроме того, я даю очень полезный метод в примере, а не игрушечный пример.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню