Je veux exécuter des mongo
commandes dans un script shell, par exemple dans un script test.sh
:
#!/bin/sh
mongo myDbName
db.mycollection.findOne()
show collections
Lorsque j'exécute ce script via ./test.sh
, la connexion à MongoDB est établie, mais les commandes suivantes ne sont pas exécutées.
Comment exécuter d'autres commandes via un script shell test.sh
?
.find()
opérations, vous devez appeler une opération sur l'objet résultat pour imprimer les documents, tels quetoArray()
oushellPrint()
. par exemple,mongo userdb --eval "printjson(db.users.find().toArray())"
mongo mydb --eval "db.users.find({a:'b'}).pretty().shellPrint()"
... simples :)mongo --eval "db.version()" --quiet
par exemple pour éviter d'imprimer tout le bruit que vous ditesMettez votre script mongo dans un
.js
fichier.Ensuite, exécutez
mongo < yourFile.js
Ex:
demo.js // le fichier a votre script
conservez ce fichier dans "c: \ db-scripts"
Ensuite, dans l'invite cmd, accédez à "c: \ db-scripts"
Cela exécutera le code en mongo et affichera la sortie
la source
.js
fichier et passez-les en paramètre à lamongo
commande.use dbName
etshow dbs
fonctionneront donc à partir de l'invite interne du shell mais pas à l'intérieur d'un.js
fichier. Il existe des équivalents JavaScript pour les commandes non JavaScript, il ne s'agit donc pas d'une limitation, mais d'une chose dont vous devez être conscient.mongo dbName -u userName -p "password with spaces" scriptToRun.js
Cela fonctionne pour moi sous Linux:
la source
Mettez ceci dans un fichier appelé
test.js
:puis lancez-le avec
mongo myDbName test.js
.la source
Il existe une documentation officielle page de officielle à ce sujet.
Voici des exemples de cette page:
la source
Le script shell ci-dessous a également bien fonctionné pour moi ... il fallait certainement utiliser la redirection qu'Antonin a mentionnée au début ... qui m'a donné l'idée de tester le document ici.
la source
echo -e "use mydb\ndb.leads.findOne()\ndb.leads.find().count()" | mongo
use another_db
. :-)db = db.getSiblingDB('otherdb');
mongo mydb <<EOF
etc.Dans ma configuration, je dois utiliser:
la source
J'utilise la syntaxe "heredoc", que David Young mentionne. Mais il ya un hic:
Ce qui précède ne fonctionnera PAS, car l'expression «$ existe» sera vue par le shell et remplacée par la valeur de la variable d'environnement nommée «existe». Ce qui, probablement, n'existe pas, donc après l'expansion du shell, cela devient:
Pour le faire passer, vous avez deux options. On est moche, on est plutôt sympa. Tout d'abord, le laid: échapper aux signes $:
Je ne le recommande PAS, car il est facile d'oublier de s'échapper.
L'autre option est d'échapper à l'EOF, comme ceci:
Maintenant, vous pouvez mettre tous les signes dollar que vous souhaitez dans votre hérédoc, et les signes dollar sont ignorés. L'inconvénient: cela ne fonctionne pas si vous devez mettre des paramètres / variables shell dans votre script mongo.
Une autre option avec laquelle vous pouvez jouer est de jouer avec votre shebang. Par exemple,
Il y a plusieurs problèmes avec cette solution:
Cela ne fonctionne que si vous essayez de rendre un script shell mongo exécutable à partir de la ligne de commande. Vous ne pouvez pas mélanger des commandes shell standard avec des commandes shell mongo. Et tout ce que vous économisez en le faisant, c'est de ne pas avoir à taper "mongo" sur la ligne de commande ... (raison suffisante, bien sûr)
Il fonctionne exactement comme "mongo <some-js-file>" ce qui signifie qu'il ne vous permet pas d'utiliser la commande "use <db>".
J'ai essayé d'ajouter le nom de la base de données au shebang, ce qui pourrait fonctionner. Malheureusement, la façon dont le système traite la ligne shebang, tout ce qui se trouve après le premier espace est passé en tant que paramètre unique (comme s'il était cité) à la commande env, et env ne parvient pas à le trouver et à l'exécuter.
Au lieu de cela, vous devez intégrer la modification de la base de données dans le script lui-même, comme ceci:
Comme pour tout dans la vie, "il y a plus d'une façon de le faire!"
la source
Si l'authentification est activée:
la source
Créez un fichier de script; écrire des commandes:
En
file.js
écrivant votre requête mongo:la source
Que dis-tu de ça:
la source
.mongorc
avoir été chargé ( docs.mongodb.org/manual/reference/program/mongo/… )Comme suggéré par
theTuxRacer
, vous pouvez utiliser la commande eval , pour ceux qui la manquent comme moi, vous pouvez également ajouter votre nom de base de données si vous n'essayez pas d'effectuer une opération sur la base de données par défaut.la source
Je vous remercie
printf
! Dans un environnement Linux, voici une meilleure façon d'avoir un seul fichier pour exécuter le show. Supposons que vous ayez deux fichiers,mongoCmds.js
avec plusieurs commandes:puis le fichier shell du pilote,
runMongoCmds.sh
Au lieu de cela, ayez un seul fichier, runMongoCmds.sh contenant
Bash
printf
est beaucoup plus robusteecho
et permet aux\n
commandes entre de les forcer sur plusieurs lignes.la source
la source
Dans mon cas, je peux facilement utiliser
\n
comme séparateur pour la prochaine commande mongo que je veux exécuter, puis les diriger versmongo
la source
Le drapeau --shell peut également être utilisé pour les fichiers javascript
la source
mongo /path/to/jsfile/test.js
exécutera le js aussi.la source
A récemment migré de mongodb vers Postgres. C'est ainsi que j'ai utilisé les scripts.
Lisez la
scripts.js
redirection et la sortie versinserts.sql
.scripts.js
ressemble à çainserts.sql
ressemble à çala source
How to execute mongo commands through shell scripts?
Ce n'est pas hors sujet. En fait, j'ai atteint cette question en raison du titre. Les gens comme moi ont donc intérêt à lire une telle réponse. En outre, je donne une méthode très utile dans l'exemple plutôt qu'un exemple de jouet.Si vous voulez le gérer avec une seule ligne, c'est un moyen simple.
la source
J'ai écrit les différentes options pour exécuter un script Shell Mongo à partir d'un script Bash plus grand
la source
Solution de script shell unique avec possibilité de passer des arguments mongo (
--quiet
, dbname, etc.):Le
-S
drapeau peut ne pas fonctionner sur toutes les plateformes.la source
Lorsque vous utilisez un jeu de réplicas, les écritures doivent être effectuées sur le PRIMARY, donc j'utilise généralement une syntaxe comme celle-ci qui évite d'avoir à déterminer quel hôte est le maître:
mongo -host myReplicaset/anyKnownReplica
la source