Ich verwende die "Heredoc" -Syntax, die David Young erwähnt. Aber es gibt einen Haken:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
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:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { : true }
})
.forEach( printjson );
EOF
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:
#!/usr/bin/sh
mongo <db> <<EOF
db.<collection>.find({
fieldName: { \$exists: true }
})
.forEach( printjson );
EOF
Ich empfehle dies NICHT, da es leicht ist, die Flucht zu vergessen.
Die andere Möglichkeit besteht darin, dem EOF wie folgt zu entkommen:
#!/usr/bin/sh
mongo <db> <<\EOF
db.<collection>.find({
fieldName: { $exists: true }
})
.forEach( printjson );
EOF
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,
#!/bin/env mongo
<some mongo stuff>
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:
#!/bin/env mongo
db = db.getSiblingDB('<db>');
<your script>
Wie bei allem im Leben gibt es "mehr als einen Weg, dies zu tun!"
.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())"