Как выполнить команды 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>
положить это в файл под названием 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
}
Как насчет этого:
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>
есть несколько проблем с этим решением:
он работает, только если вы пытаетесь сделать сценарий оболочки mongo исполняемым из командной строки. Вы не можете смешивать обычные команды оболочки с командами оболочки mongo. И все, что вы экономите, делая это, не нужно вводить "mongo" в командной строке... (причина, конечно, достаточная)
он функционирует точно так же, как" 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();
Если вы хотите справиться с это простой способ.
file.sh --> db.EXPECTED_COLLECTION.remove("_id":1234)
cat file.sh | mongo <EXPECTED_COLLECTION>
В моем случае, я могу удобно использовать \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');