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

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

Я попытался следующим образом test.sh

#!/bin/sh

mongo myDbName

db.mycollection.findOne()

show collections

когда я выполняю выше скрипт ./test.sh

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

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

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

19 ответов


вы также можете оценить команду, используя --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 :

поместите свой сценарий mongo в .

выполнить mongo < yourFile.js

Ex:

демо.файл JS //ваш скрипт

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>

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

mongo < script.js

положить это в файл под названием test.js:

db.mycollection.findOne()
db.getCollectionNames().forEach(function(collection) {
  print(collection);
});
С mongo myDbName test.js.

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

Примеры с этой страницы включают в себя:

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

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

function testMongoScript {
    mongo <<EOF
    use mydb
    db.leads.findOne()
    db.leads.find().count()
EOF
}

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

mongo --host="the.server.ip:port" databaseName theScript.js 

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

echo "db.mycollection.findOne()" | mongo myDbName
echo "show collections" | mongo myDbName

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

mongo <dbname> --eval "printjson(db.something.find())"

Я использую синтаксис "heredoc", который упоминает Дэвид Янг. Но есть одна загвоздка:--7-->

#!/usr/bin/sh

mongo <db> <<EOF
db.<collection>.find({
  fieldName: { $exists: true }
})
.forEach( printjson );
EOF

вышеуказанное не будет работать, потому что фраза "$exists "будет видна оболочке и заменена значением переменной среды с именем" exists."Которого, скорее всего, не существует, поэтому после расширения оболочки он становится:

#!/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.

другой вариант, с которым вы можете играть, - это возиться с вашим shebang. Для пример,

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

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

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

  2. он функционирует точно так же, как" mongo ", что означает, что он не позвольте вам использовать команду " use ".

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

вместо этого вы должны встроить изменение базы данных в сам скрипт, например:

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

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


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

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

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

use someDb
db.someColl.find()

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

mongo < mongoCmds.js

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

printf "use someDb\ndb.someColl.find()" | mongo
Баша!--3--> гораздо надежнее, чем echo и \n между командами, чтобы заставить их на несколько строк.

создать файл сценария; написать команды:

#!/bin/sh
mongo < file.js

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

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

mongo db_name --eval "db.user_info.find().forEach(function(o) {print(o._id);})"

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

 mongo --shell /path/to/jsfile/test.js 

Если вы хотите справиться с это простой способ.

file.sh --> db.EXPECTED_COLLECTION.remove("_id":1234)

cat file.sh | mongo <EXPECTED_COLLECTION>

mongo <<EOF
use <db_name>
db.getCollection("<collection_name>").find({})
EOF

В моем случае, я могу удобно использовать \n в качестве разделителя для следующей команды mongo я хочу выполнить, а затем передать их в mongo

echo $'use your_db\ndb.yourCollection.find()' | mongo

недавно мигрировал из 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');