Chcę wykonywać mongo
polecenia w skrypcie powłoki, np. W skrypcie test.sh
:
#!/bin/sh
mongo myDbName
db.mycollection.findOne()
show collections
Kiedy wykonuję ten skrypt za pośrednictwem ./test.sh
, połączenie z MongoDB jest ustanawiane, ale następujące polecenia nie są wykonywane.
Jak wykonać inne polecenia za pomocą skryptu powłoki test.sh
?
.find()
operacji należy wywołać operację na obiekcie wynikowym, aby wydrukować dokumenty, takie jaktoArray()
lubshellPrint()
. np.mongo userdb --eval "printjson(db.users.find().toArray())"
mongo mydb --eval "db.users.find({a:'b'}).pretty().shellPrint()"
... simples :)mongo --eval "db.version()" --quiet
na przykład, aby uniknąć drukowania całego hałasu, który mówiszUmieść skrypt mongo w
.js
pliku.Następnie wykonaj
mongo < yourFile.js
Dawny:
Plik demo.js // ma twój skrypt
przechowuj ten plik w „c: \ db-scripts”
Następnie w wierszu polecenia cmd przejdź do „c: \ db-scripts”
Spowoduje to wykonanie kodu w mongo i wyświetlenie wyniku
źródło
.js
pliku i przekazujesz jako parametr domongo
polecenia.use dbName
ishow dbs
będzie działać z nazwą powłoki wewnętrznej szybki, ale nie od wewnątrz.js
pliku. Istnieją polecenia w języku JavaScript dla poleceń innych niż JavaScript, więc nie jest to ograniczenie, tylko coś, o czym musisz wiedzieć.mongo dbName -u userName -p "password with spaces" scriptToRun.js
Działa to dla mnie pod Linuksem:
źródło
Umieść to w pliku o nazwie
test.js
:następnie uruchom go
mongo myDbName test.js
.źródło
Istnieje również oficjalna strona dokumentacji na ten temat.
Przykłady z tej strony to:
źródło
Poniższy skrypt powłoki również działał dobrze dla mnie ... zdecydowanie musiałem użyć przekierowania, o którym Antonin wspomniał na początku ... co dało mi pomysł na przetestowanie tego dokumentu.
źródło
echo -e "use mydb\ndb.leads.findOne()\ndb.leads.find().count()" | mongo
use another_db
. :-)db = db.getSiblingDB('otherdb');
mongo mydb <<EOF
Itp.W mojej konfiguracji muszę używać:
źródło
Używam składni „heredoc”, o której wspomina David Young. Ale jest w tym haczyk:
Powyższe NIE zadziała, ponieważ wyrażenie „$ istnieje” będzie widziane przez powłokę i podstawione wartością zmiennej środowiskowej o nazwie „istnieje”. Co prawdopodobnie nie istnieje, więc po rozszerzeniu powłoki staje się:
Aby przejść, masz dwie opcje. Jeden jest brzydki, drugi jest całkiem fajny. Po pierwsze, brzydka: uciec od znaków $:
NIE polecam tego, ponieważ łatwo jest zapomnieć o ucieczce.
Inną opcją jest ucieczka przed EOF, tak jak to:
Teraz możesz umieścić wszystkie znaki dolara w swoim heredoc, a znaki dolara są ignorowane. Wada: To nie działa, jeśli musisz umieścić parametry / zmienne powłoki w skrypcie mongo.
Inną opcją, z którą możesz grać, jest bałagan z shebangiem. Na przykład,
Istnieje kilka problemów z tym rozwiązaniem:
Działa to tylko wtedy, gdy próbujesz wykonać skrypt powłoki mongo jako wykonywalny z wiersza poleceń. Nie można łączyć zwykłych poleceń powłoki z poleceniami powłoki mongo. I jedyne, co oszczędzasz, robiąc to, nie musisz wpisywać „mongo” w wierszu poleceń ... (oczywiście wystarczający powód)
Działa dokładnie jak „mongo <some-js-file>”, co oznacza, że nie pozwala na użycie polecenia „use <db>”.
Próbowałem dodać nazwę bazy danych do shebang, co według ciebie byłoby skuteczne. Niestety, sposób, w jaki system przetwarza linię shebang, wszystko po pierwszym spacji jest przekazywane jako pojedynczy parametr (jak w cudzysłowie) do polecenia env, a env nie może go znaleźć i uruchomić.
Zamiast tego musisz osadzić zmianę bazy danych w samym skrypcie, tak:
Jak w przypadku wszystkiego w życiu, „istnieje więcej niż jeden sposób, aby to zrobić!”
źródło
Jeśli masz włączone uwierzytelnianie:
źródło
Utwórz plik skryptu; napisz polecenia:
W
file.js
zapisie zapytanie Mongo:źródło
Co powiesz na to:
źródło
.mongorc
załadowaniu ( docs.mongodb.org/manual/reference/program/mongo/… )Jak sugeruje
theTuxRacer
, możesz użyć polecenia eval , dla tych, którzy go brakuje, tak jak ja, możesz także dodać w nazwie db, jeśli nie próbujesz wykonać operacji na domyślnym db.źródło
Dziękuję
printf
! W środowisku Linux jest lepszy sposób na uruchomienie tylko jednego pliku. Załóżmy, że masz dwa plikimongoCmds.js
z wieloma poleceniami:a następnie plik powłoki sterownika,
runMongoCmds.sh
Zamiast tego, masz tylko jeden plik, zawierający runMongoCmds.sh
Bash
printf
jest znacznie bardziej niezawodnyecho
i pozwala na\n
wymuszanie poleceń między wieloma liniami.źródło
źródło
W moim przypadku mogę wygodnie użyć
\n
jako separatora dla następnego polecenia mongo, które chcę wykonać, a następnie potokować jemongo
źródło
Flaga --shell może być również używana do plików javascript
źródło
mongo /path/to/jsfile/test.js
będzie również egzekwować js.źródło
Ostatnio migrowałem z mongodb do Postgres. Tak korzystałem ze skryptów.
Przeczytaj
scripts.js
i przekieruj wyjście nainserts.sql
.scripts.js
wygląda takinserts.sql
wygląda takźródło
How to execute mongo commands through shell scripts?
To nie jest nie na temat. W rzeczywistości dotarłem do tego pytania z powodu tytułu. Więc ludzie tacy jak ja korzystają z czytania takiej odpowiedzi. Daję też bardzo przydatną metodę w tym przykładzie, a nie zabawkę.Jeśli chcesz poradzić sobie z jedną linią, jest to łatwy sposób.
źródło
I pisał się różne opcje Uruchamianie Mongo Shell Script od wewnątrz większego skryptu bash
źródło
Skrypt jednopowłokowy z możliwością przekazywania argumentów mongo (
--quiet
, dbname itp.):-S
Flaga może nie działać na wszystkich platformach.źródło
Podczas korzystania z replikaseta zapisy muszą być wykonywane na PODSTAWOWEJ, więc zwykle używam takiej składni, co pozwala uniknąć konieczności ustalania, który host jest nadrzędny:
mongo -host myReplicaset/anyKnownReplica
źródło