¿Cómo ejecutar comandos mongo a través de scripts de shell?

Quiero ejecutar comandos mongo en script de shell.

Intenté seguir el camino test.sh

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

Cuando ejecuto el script anterior ./test.sh

Luego se estableció la conexión de mongo pero los siguientes comandos no se ejecutaron

¿Cómo ejecutar otros comandos a través del script sh [test.sh]?

por favor, ayúdame

También puede evaluar un comando usando el indicador --eval , si es solo un comando.

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

Tenga en cuenta: si está utilizando operadores Mongo, comenzando con un signo $, querrá rodear el argumento eval entre comillas simples para evitar que el shell evalúe al operador como una variable de entorno:

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

De lo contrario, puede ver algo como esto:

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

Pon tu script mongo en un archivo .js .

Luego ejecuta mongo < yourFile.js

Ex:

demo.js // file tiene su script

 use sample //db name show collections 

mantén este archivo en "c: \ db-scripts"

Luego, en cmd prompt dirígete a "c: \ db-scripts"

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

Esto ejecutará el código en mongo y muestra la salida

 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> 

Esto funciona para mí en Linux:

 mongo < script.js 

Pon esto en un archivo llamado test.js :

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

luego mongo myDbName test.js con mongo myDbName test.js

También hay una página de documentación oficial sobre esto.

Los ejemplos de esa página incluyen:

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

El siguiente script de shell también funcionó bien para mí … Definitivamente tuve que usar la redirección que Antonin mencionó al principio … eso me dio la idea de probar el documento aquí.

 function testMongoScript { mongo < 

En mi configuración, tengo que usar:

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

Qué tal esto:

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

Utilizo la syntax “heredoc”, que menciona David Young. Pero hay una trampa:

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

Lo anterior NO funcionará, porque la frase “$ exists” será vista por el shell y sustituida por el valor de la variable de entorno llamada “exists”. Lo cual, probablemente, no existe, por lo que después de la expansión del shell, se convierte en:

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

Para que pase, tienes dos opciones. Uno es feo, uno es bastante agradable. Primero, el feo: escape de los $ signos:

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

NO lo recomiendo, porque es fácil olvidarse de escapar.

La otra opción es escapar del EOF, así:

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

Ahora puede colocar todos los signos de dólar que desee en su heredoc y los signos de dólar son ignorados. El lado negativo: eso no funciona si necesita poner parámetros / variables de shell en su script mongo.

Otra opción con la que puedes jugar es meterse con tu shebang. Por ejemplo,

 #!/bin/env mongo  

Hay varios problemas con esta solución:

  1. Solo funciona si intenta hacer un script mongo shell ejecutable desde la línea de comando. No puede mezclar comandos normales de shell con comandos de mongo shell. Y todo lo que ahorras al hacerlo es no tener que escribir “mongo” en la línea de comandos … (razón suficiente, por supuesto)

  2. Funciona exactamente como “mongo ” lo que significa que no le permite usar el comando “use “.

He intentado agregar el nombre de la base de datos al shebang, lo que se podría pensar que funcionaría. Desafortunadamente, la forma en que el sistema procesa la línea de shebang, todo después del primer espacio se pasa como un parámetro único (como si se citara) al comando de env, y env no puede encontrarlo ni ejecutarlo.

En su lugar, debe incrustar el cambio de la base de datos dentro del script, así:

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

Como con cualquier cosa en la vida, “¡hay más de una manera de hacerlo!”

Como sugiere theTuxRacer , puede usar el comando eval , para aquellos que lo están perdiendo como yo, también puede agregar su nombre db si no está tratando de preformar la operación en el db predeterminado.

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

En caso de que tenga la autenticación habilitada:

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

Gracias printf ! En un entorno Linux, aquí hay una mejor manera de tener solo un archivo para ejecutar el progtwig. Digamos que tiene dos archivos, mongoCmds.js con múltiples comandos:

 use someDb db.someColl.find() 

y luego el archivo de shell del controlador, runMongoCmds.sh

 mongo < mongoCmds.js 

En su lugar, tenga solo un archivo, runMongoCmds.sh que contenga

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

El printf de Bash es mucho más robusto que el echo y permite \n entre comandos para forzarlos en múltiples líneas.

Crea un archivo de script; escribir comandos:

 #!/bin/sh mongo < file.js 

En file.js escribe tu consulta de mongo:

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

–shell flag también se puede usar para archivos javascript

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

Si quieres manejarlo con una línea, es una manera fácil.

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

En mi caso, puedo usar convenientemente \n como separador para el siguiente comando de mongo que quiero ejecutar y luego canalizarlos a mongo

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

Recientemente migrado de mongodb a Postgres. Así es como utilicé los scripts.

 mongo < scripts.js > inserts.sql 

Lea scripts.js y redireccione a inserts.sql .

scripts.js parece a esto

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

inserts.sql parece a esto

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