Ich möchte mongo
Befehle in einem Shell-Skript ausführen , z. B. in einem Skript test.sh
:
#!/bin/sh
mongo myDbName
db.mycollection.findOne()
show collections
Wenn ich dieses Skript über ausführe ./test.sh
, wird die Verbindung zu MongoDB hergestellt, aber die folgenden Befehle werden nicht ausgeführt.
Wie führe ich andere Befehle über ein Shell-Skript aus test.sh
?
.find()
Vorgänge müssen Sie einen Vorgang für das Ergebnisobjekt aufrufen, um die Dokumente wietoArray()
oder zu druckenshellPrint()
. zBmongo userdb --eval "printjson(db.users.find().toArray())"
mongo mydb --eval "db.users.find({a:'b'}).pretty().shellPrint()"
... simples :)mongo --eval "db.version()" --quiet
zum Beispiel tun, um zu vermeiden, alle Geräusche zu drucken, die Sie sagenFügen Sie Ihr Mongo-Skript in eine
.js
Datei ein.Dann ausführen
mongo < yourFile.js
Ex:
Die Datei demo.js // enthält Ihr Skript
Bewahren Sie diese Datei in "c: \ db-scripts" auf.
Gehen Sie dann in der cmd-Eingabeaufforderung zu "c: \ db-scripts".
Dadurch wird der Code in Mongo ausgeführt und die Ausgabe angezeigt
quelle
.js
Datei und übergeben sie als Parameter an denmongo
Befehl.use dbName
undshow dbs
wird von der Shell internen Prompt arbeiten , aber nicht aus dem Innern einer.js
Datei. Es gibt JavaScript-Entsprechungen für Nicht-JavaScript-Befehle. Dies ist also keine Einschränkung, sondern nur etwas, das Sie beachten müssen.mongo dbName -u userName -p "password with spaces" scriptToRun.js
Das funktioniert bei mir unter Linux:
quelle
Fügen Sie dies in eine Datei mit dem Namen ein
test.js
:dann starte es mit
mongo myDbName test.js
.quelle
Es gibt auch eine offizielle Dokumentationsseite dazu.
Beispiele auf dieser Seite sind:
quelle
Das Shell-Skript unten funktionierte auch gut für mich ... definitiv musste ich die Umleitung verwenden, die Antonin zuerst erwähnte ... das brachte mich auf die Idee, das hier gezeigte Dokument zu testen.
quelle
echo -e "use mydb\ndb.leads.findOne()\ndb.leads.find().count()" | mongo
use another_db
. :-)db = db.getSiblingDB('otherdb');
mongo mydb <<EOF
In meinem Setup muss ich verwenden:
quelle
Ich verwende die "Heredoc" -Syntax, die David Young erwähnt. Aber es gibt einen Haken:
Das Obige funktioniert NICHT, da der Ausdruck "$ existiert" von der Shell gesehen und durch den Wert der Umgebungsvariablen mit dem Namen "existiert" ersetzt wird. Was wahrscheinlich nicht existiert, also wird es nach der Shell-Erweiterung:
Um es passieren zu lassen, haben Sie zwei Möglichkeiten. Einer ist hässlich, einer ist ganz nett. Erstens die hässliche: Entkomme den $ -Zeichen:
Ich empfehle dies NICHT, da es leicht ist, die Flucht zu vergessen.
Die andere Möglichkeit besteht darin, dem EOF wie folgt zu entkommen:
Jetzt können Sie alle gewünschten Dollarzeichen in Ihren Heredoc einfügen, und die Dollarzeichen werden ignoriert. Die Kehrseite: Das funktioniert nicht, wenn Sie Shell-Parameter / -Variablen in Ihr Mongo-Skript einfügen müssen.
Eine andere Möglichkeit, mit der Sie spielen können, besteht darin, sich mit Ihrem Schebang anzulegen. Zum Beispiel,
Bei dieser Lösung gibt es mehrere Probleme:
Es funktioniert nur, wenn Sie versuchen, ein Mongo-Shell-Skript über die Befehlszeile ausführbar zu machen. Sie können keine regulären Shell-Befehle mit Mongo-Shell-Befehlen mischen. Und alles, was Sie dadurch sparen, ist, dass Sie nicht "mongo" in die Befehlszeile eingeben müssen ... (Grund genug natürlich)
Es funktioniert genau wie "mongo <some-js-file>", was bedeutet, dass Sie den Befehl "use <db>" nicht verwenden können.
Ich habe versucht, den Datenbanknamen zum Shebang hinzuzufügen, was Ihrer Meinung nach funktionieren würde. Leider wird bei der Art und Weise, wie das System die Shebang-Zeile verarbeitet, alles nach dem ersten Leerzeichen als einzelner Parameter (wie angegeben) an den Befehl env übergeben, und env kann ihn nicht finden und ausführen.
Stattdessen müssen Sie die Datenbankänderung wie folgt in das Skript selbst einbetten:
Wie bei allem im Leben gibt es "mehr als einen Weg, dies zu tun!"
quelle
Falls Sie die Authentifizierung aktiviert haben:
quelle
Erstellen Sie eine Skriptdatei. Schreibbefehle:
In
file.js
Schreiben Sie Ihre Mongo Abfrage:quelle
Wie wäre es damit:
quelle
.mongorc
es geladen wurde ( docs.mongodb.org/manual/reference/program/mongo/… )Wie von vorgeschlagen
theTuxRacer
, können Sie den Befehl eval verwenden . Für diejenigen, denen er wie ich fehlt, können Sie auch Ihren Datenbanknamen hinzufügen, wenn Sie nicht versuchen, eine Operation für die Standarddatenbank durchzuführen.quelle
Danke
printf
! In einer Linux-Umgebung ist es besser, wenn nur eine Datei die Show ausführt. Angenommen, Sie haben zwei DateienmongoCmds.js
mit mehreren Befehlen:und dann die Treiber-Shell-Datei,
runMongoCmds.sh
Verwenden Sie stattdessen nur eine Datei, die runMongoCmds.sh enthält
Bash's
printf
ist viel robuster alsecho
und ermöglicht es den\n
Zwischenbefehlen, sie in mehreren Zeilen zu erzwingen.quelle
quelle
In meinem Fall kann ich bequem
\n
als Trennzeichen für den nächsten Mongo-Befehl verwenden, den ich ausführen möchte, und ihn dann weiterleitenmongo
quelle
Das Flag --shell kann auch für Javascript-Dateien verwendet werden
quelle
mongo /path/to/jsfile/test.js
wird auch die js ausführen.quelle
Kürzlich von Mongodb nach Postgres migriert. So habe ich die Skripte verwendet.
Lesen Sie die
scripts.js
und geben Sie die Umleitung an ausinserts.sql
.scripts.js
sieht aus wie dasinserts.sql
sieht aus wie dasquelle
How to execute mongo commands through shell scripts?
Dies ist kein Off-Topic. Tatsächlich habe ich diese Frage aufgrund des Titels erreicht. Leute wie ich profitieren davon, eine solche Antwort zu lesen. Außerdem gebe ich im Beispiel eher eine sehr nützliche Methode als ein Spielzeugbeispiel.Wenn Sie es mit einer Zeile behandeln möchten, ist dies ein einfacher Weg.
quelle
Ich schrieb auf die verschiedenen Optionen für das Ausführen eines Mongo Shell - Skript aus innerhalb eines größeren Bash - Skript
quelle
Single-Shell-
--quiet
Skriptlösung mit der Fähigkeit, Mongo-Argumente ( , Datenbankname usw.) zu übergeben:Das
-S
Flag funktioniert möglicherweise nicht auf allen Plattformen.quelle
Wenn Sie ein Replikat verwenden, müssen Schreibvorgänge auf dem PRIMARY ausgeführt werden. Daher verwende ich normalerweise eine solche Syntax, um nicht herausfinden zu müssen, welcher Host der Master ist:
mongo -host myReplicaset/anyKnownReplica
quelle