489 Stimmen

Wie führt man Mongo-Befehle über Shell-Skripte aus?

Ich möchte Folgendes ausführen mongo Befehle in Shell-Skripten, z. B. in einem Skript test.sh :

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

Wenn ich dieses Skript über ./test.sh wird die Verbindung zu MongoDB hergestellt, aber die folgenden Befehle werden nicht ausgeführt.

Wie man andere Befehle über ein Shell-Skript ausführt test.sh ?

41voto

David H. Young Punkte 469

Das Shell-Skript unten hat bei mir auch gut funktioniert... ich musste definitiv den Redirect verwenden, den Antonin zuerst erwähnt hat... das brachte mich auf die Idee, das Dokument hier zu testen.

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

27voto

Moses Xu Punkte 2030

Falls Sie die Authentifizierung aktiviert haben:

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

Für neuere Versionen

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

24voto

John Arrowwood Punkte 2186

Ich verwende die "heredoc"-Syntax, die David Young erwähnt hat. Aber es gibt einen Haken:

#!/usr/bin/sh

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

Das obige funktioniert NICHT, weil die Phrase "$exists" von der Shell erkannt und durch den Wert der Umgebungsvariablen "exists" ersetzt wird. Die wahrscheinlich nicht existiert, so dass sie nach der Shell-Expansion zu "$exists" wird:

#!/usr/bin/sh

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

Um sie durchzulassen, haben Sie zwei Möglichkeiten. Die eine ist hässlich, die andere ist ganz nett. Erstens, die hässliche: die $-Zeichen entkommen:

#!/usr/bin/sh

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

Ich empfehle dies NICHT, denn man kann leicht vergessen zu fliehen.

Die andere Möglichkeit besteht darin, das EOF zu umgehen, etwa so:

#!/usr/bin/sh

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

Jetzt können Sie so viele Dollarzeichen in Ihr Heredoc eingeben, wie Sie wollen, und die Dollarzeichen werden ignoriert. Der Nachteil: Das funktioniert nicht, wenn Sie Shell-Parameter/Variablen in Ihr Mongo-Skript einfügen müssen.

Eine weitere Option, die Sie ausprobieren können, ist das Durcheinanderbringen Ihrer Ausrüstung. Zum Beispiel,

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

Bei dieser Lösung gibt es mehrere Probleme:

  1. Es funktioniert nur, wenn Sie versuchen, ein Mongo-Shell-Skript über die Befehlszeile ausführbar zu machen. Sie können keine normalen Shell-Befehle mit Mongo-Shell-Befehlen mischen. Und alles, was Sie dadurch sparen, ist, dass Sie "mongo" nicht in die Kommandozeile eingeben müssen... (Grund genug, natürlich)

  2. Es funktioniert genau wie "mongo <some-js-file>", d.h. Sie können den Befehl "use <db>" nicht verwenden.

Ich habe versucht, den Namen der Datenbank in das Verzeichnis einzufügen, was eigentlich funktionieren sollte. Leider verarbeitet das System die shebang-Zeile so, dass alles nach dem ersten Leerzeichen als einzelner Parameter (wie in Anführungszeichen) an den env-Befehl übergeben wird und env ihn nicht finden und ausführen kann.

Stattdessen müssen Sie die Datenbankänderung in das Skript selbst einbetten, etwa so:

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

Wie bei allem im Leben gilt auch hier: "Es gibt mehr als einen Weg, es zu tun!"

23voto

Ed Williams Punkte 558

In meinem Setup muss ich verwenden:

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

Für neuere Versionen von mongodb

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

17voto

Mark Butler Punkte 4293

Wie wäre es damit:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X