Как выполнять команды монго через скрипты оболочки? - PullRequest
347 голосов
/ 29 января 2011

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

#!/bin/sh
mongo myDbName
db.mycollection.findOne()
show collections

Когда я выполняю этот сценарий с помощью ./test.sh, соединение с MongoDB устанавливается, но следующие команды не выполняются.

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

Ответы [ 20 ]

12 голосов
/ 22 декабря 2015

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

mongo <dbname> --eval "printjson(db.something.find())"
11 голосов
/ 21 августа 2017

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

#!/bin/sh
mongo < file.js

В file.js написать запрос на монго:

db.collection.find({"myValue":null}).count();
7 голосов
/ 18 декабря 2015

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

use someDb
db.someColl.find()

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

mongo < mongoCmds.js

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

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

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

4 голосов
/ 30 апреля 2015

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

 mongo --shell /path/to/jsfile/test.js 
4 голосов
/ 06 декабря 2016
mongo db_name --eval "db.user_info.find().forEach(function(o) {print(o._id);})"
3 голосов
/ 27 апреля 2018
mongo <<EOF
use <db_name>
db.getCollection("<collection_name>").find({})
EOF
2 голосов
/ 22 января 2018

Если вы хотите обработать его одной строкой, это простой способ

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

cat file.sh | mongo <EXPECTED_COLLECTION>
1 голос
/ 29 августа 2018

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

echo $'use your_db\ndb.yourCollection.find()' | mongo
1 голос
/ 07 мая 2017

Недавно мигрировал из 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 голосов
/ 13 мая 2019

I написал различные опции для запуска скрипта Mongo Shell Script из более крупного скрипта Bash

...