Comment exécuter des commandes mongo via des scripts shell?

Je veux exécuter des commandes mongo dans un script shell.

J’ai essayé de la façon suivante test.sh

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

Lorsque j’exécute le script ci-dessus ./test.sh

Puis la connexion mongo établie mais les commandes suivantes ne sont pas exécutées

Comment exécuter d’autres commandes via sh script [test.sh]?

Aidez-moi, s’il vous plaît

    Vous pouvez également évaluer une commande à l’aide de l’indicateur --eval , s’il ne s’agit que d’une seule commande.

     mongo --eval "printjson(db.serverStatus())" 

    Remarque: si vous utilisez des opérateurs Mongo, en commençant par un signe $, vous devrez entourer l’argument eval entre guillemets pour empêcher le shell d’évaluer l’opérateur en tant que variable d’environnement:

     mongo --eval 'db.test.update({"name":"foo"},{$set:{"this":"that"}});' 

    Sinon, vous pouvez voir quelque chose comme ceci:

     mongo --eval "db.test.update({\"name\":\"foo\"},{$set:{\"this\":\"that\"}});" > E QUERY SyntaxError: Unexpected token : 

    Placez votre script mongo dans un fichier .js .

    Puis exécutez mongo < yourFile.js

    Ex:

    demo.js // fichier a votre script

     use sample //db name show collections 

    conservez ce fichier dans "c: \ db-scripts"

    Ensuite, dans l'invite de commande, allez dans "c: \ db-scripts"

     C:\db-scripts>mongo < demo.js 

    Cela va exécuter le code dans Mongo et montre la sortie

     C:\db-scripts>mongo < demo.js Mongo shell version: 3.0.4 Connecting to: test switched to db sample users //collection name tasks //collection name bye C:\db-scripts> 

    Cela fonctionne pour moi sous Linux:

     mongo < script.js 

    Mettez ceci dans un fichier appelé test.js :

     db.mycollection.findOne() db.getCollectionNames().forEach(function(collection) { print(collection); }); 

    puis lancez-le avec mongo myDbName test.js

    Il existe également une page de documentation officielle à ce sujet.

    Voici des exemples de cette page:

     mongo server:27017/dbname --quiet my_commands.js mongo test --eval "printjson(db.getCollectionNames())" 

    Le script shell ci-dessous a également fonctionné très bien pour moi … définitivement dû utiliser la redirection qu’Antonin a mentionnée au début … cela m’a donné l’idée de tester le document ici.

     function testMongoScript { mongo < 

    Dans ma configuration, je dois utiliser:

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

    Que dis-tu de ça:

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

    J’utilise la syntaxe “heredoc”, mentionnée par David Young. Mais il ya un hic:

     #!/usr/bin/sh mongo  <.find({ fieldName: { $exists: true } }) .forEach( printjson ); EOF 

    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”. Qui, probablement, n’existe pas, donc après l’expansion de la shell, il devient:

     #!/usr/bin/sh mongo  <.find({ fieldName: { : true } }) .forEach( printjson ); EOF 

    Pour le faire passer, vous avez deux options. On est moche, on est assez sympa. Tout d’abord, le plus moche: échapper aux signes $:

     #!/usr/bin/sh mongo  <.find({ fieldName: { \$exists: true } }) .forEach( printjson ); EOF 

    Je ne recommande PAS cela, car il est facile d’oublier de s’échapper.

    L’autre option est d’échapper à l’EOF, comme ceci:

     #!/usr/bin/sh mongo  <<\EOF db..find({ fieldName: { $exists: true } }) .forEach( printjson ); EOF 

    Maintenant, vous pouvez mettre tous les signes dollar que vous voulez dans votre hérédoc, et les signes dollar sont ignorés. L’inconvénient: Cela ne fonctionne pas si vous avez besoin de placer des parameters / variables de shell dans votre script mongo.

    Une autre option avec laquelle vous pouvez jouer est de jouer avec votre shebang. Par exemple,

     #!/bin/env mongo  

    Il y a plusieurs problèmes avec cette solution:

    1. Cela ne fonctionne que si vous essayez de rendre un script mongo exécutable depuis la ligne de commande. Vous ne pouvez pas mélanger des commandes shell régulières avec des commandes mongo shell. Et tout ce que vous économisez de cette manière ne consiste pas à taper “mongo” sur la ligne de commande … (raison suffisante, bien sûr)

    2. Il fonctionne exactement comme “mongo ” ce qui signifie qu’il ne vous permet pas d’utiliser la commande “use “.

    J’ai essayé d’append le nom de la firebase database au shebang, ce qui, selon vous, fonctionnerait. Malheureusement, la façon dont le système traite la ligne shebang, tout ce qui suit le premier espace est transmis 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 firebase database dans le script lui-même, comme ceci:

     #!/bin/env mongo db = db.getSiblingDB('');  

    Comme dans toute vie, “il y a plus d’une façon de le faire!”

    Comme suggéré par theTuxRacer , vous pouvez utiliser la commande eval , pour ceux qui le manquent comme je l’étais, vous pouvez également append votre nom de firebase database si vous theTuxRacer de theTuxRacer opération sur la firebase database par défaut.

     mongo  --eval "printjson(db.something.find())" 

    Dans le cas où l’authentification est activée:

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

    Merci printf ! Dans un environnement Linux, voici un meilleur moyen de ne diffuser qu’un seul fichier. Disons que vous avez deux fichiers, mongoCmds.js avec plusieurs commandes:

     use someDb db.someColl.find() 

    puis le fichier shell du pilote, runMongoCmds.sh

     mongo < mongoCmds.js 

    Au lieu de cela, avoir un seul fichier, runMongoCmds.sh contenant

     printf "use someDb\ndb.someColl.find()" | mongo 

    Le printf de Bash est beaucoup plus robuste que l' echo et permet aux commandes \n entre les forcer sur plusieurs lignes.

    Créer un fichier de script commandes d’écriture:

     #!/bin/sh mongo < file.js 

    Dans file.js écrivez votre requête mongo:

     db.collection.find({"myValue":null}).count(); 

    –shell flag peut également être utilisé pour les fichiers javascript

      mongo --shell /path/to/jsfile/test.js 
     mongo db_name --eval "db.user_info.find().forEach(function(o) {print(o._id);})" 

    Si vous voulez le gérer avec une seule ligne, c’est facile.

     file.sh --> db.EXPECTED_COLLECTION.remove("_id":1234) cat file.sh | mongo  
     mongo < db.getCollection("").find({}) EOF 

    Dans mon cas, je peux facilement utiliser \n comme séparateur pour la prochaine commande mongo que je veux exécuter puis les mongo vers mongo

     echo $'use your_db\ndb.yourCollection.find()' | mongo 

    Récemment migré de mongodb à Postgres. C’est comme ça que j’ai utilisé les scripts.

     mongo < scripts.js > inserts.sql 

    Lisez les scripts.js et scripts.js la redirection vers inserts.sql .

    scripts.js ressemble à ceci

     use myDb; var ssortingng = "INSERT INTO table(a, b) VALUES"; db.getCollection('collectionName').find({}).forEach(function (object) { ssortingng += "('" + Ssortingng(object.description) + "','" + object.name + "'),"; }); print(ssortingng.subssortingng(0, ssortingng.length - 1), ";"); 

    inserts.sql ressemble à ceci

     INSERT INTO table(a, b) VALUES('abc', 'Alice'), ('def', 'Bob'), ('ghi', 'Claire');