Quiero ejecutar mongo
comandos en el script de shell, por ejemplo, en un script test.sh
:
#!/bin/sh
mongo myDbName
db.mycollection.findOne()
show collections
Cuando ejecuto este script vía ./test.sh
, se establece la conexión con MongoDB, pero no se ejecutan los siguientes comandos.
¿Cómo ejecutar otros comandos a través del script de shell test.sh
?
.find()
operaciones, debe llamar a una operación en el objeto de resultado para imprimir los documentos, comotoArray()
oshellPrint()
. por ejemplo,mongo userdb --eval "printjson(db.users.find().toArray())"
mongo mydb --eval "db.users.find({a:'b'}).pretty().shellPrint()"
... simples :)mongo --eval "db.version()" --quiet
por ejemplo, para evitar imprimir todo el ruido que dicesPon tu script mongo en un
.js
archivo.Luego ejecuta
mongo < yourFile.js
Ex:
El archivo demo.js // tiene su script
mantenga este archivo en "c: \ db-scripts"
Luego, en cmd prompt, vaya a "c: \ db-scripts"
Esto ejecutará el código en mongo y muestra la salida
fuente
.js
archivo y los pasas como un parámetro almongo
comando.use dbName
, yshow dbs
trabajará a partir de la cáscara pronta interna, pero no desde el interior de un.js
archivo. Hay equivalentes de JavaScript para los comandos que no son de JavaScript, por lo que esto no es una limitación, solo algo que debe tener en cuenta.mongo dbName -u userName -p "password with spaces" scriptToRun.js
Esto funciona para mí en Linux:
fuente
Pon esto en un archivo llamado
test.js
:luego ejecútalo con
mongo myDbName test.js
.fuente
También hay una página de documentación oficial sobre esto.
Los ejemplos de esa página incluyen:
fuente
El siguiente script de shell también funcionó muy bien para mí ... definitivamente tuve que usar la redirección que Antonin mencionó al principio ... que me dio la idea de probar el documento aquí.
fuente
echo -e "use mydb\ndb.leads.findOne()\ndb.leads.find().count()" | mongo
use another_db
. :-)db = db.getSiblingDB('otherdb');
mongo mydb <<EOF
etc.En mi configuración tengo que usar:
fuente
Uso la sintaxis "heredoc", que menciona David Young. Pero hay una trampa:
Lo anterior NO funcionará, porque la frase "$ existe" será vista por el shell y sustituida con el valor de la variable de entorno llamada "existe". Lo cual, probablemente, no existe, por lo que después de la expansión de shell, se convierte en:
Para que pase, tienes dos opciones. Uno es feo, uno es bastante agradable. Primero, el feo: escapar de los signos $:
NO recomiendo esto, porque es fácil olvidar escapar.
La otra opción es escapar del EOF, así:
Ahora, puede poner todos los signos de dólar que desee en su heredoc, y los signos de dólar se ignoran. 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,
Hay varios problemas con esta solución:
Solo funciona si intenta hacer que un script de shell mongo sea ejecutable desde la línea de comandos. No puede mezclar comandos de shell normales con comandos de shell mongo. Y todo lo que ahorra al hacerlo es no tener que escribir "mongo" en la línea de comando ... (razón suficiente, por supuesto)
Funciona exactamente como "mongo <some-js-file>", lo que significa que no le permite usar el comando "use <db>".
Intenté agregar el nombre de la base de datos al shebang, que pensarías que funcionaría. Desafortunadamente, la forma en que el sistema procesa la línea shebang, todo después del primer espacio se pasa como un solo parámetro (como si fuera citado) al comando env, y env no puede encontrarlo ni ejecutarlo.
En cambio, debe incrustar el cambio de la base de datos dentro del script en sí, así:
Como con cualquier cosa en la vida, "¡hay más de una forma de hacerlo!"
fuente
En caso de que tenga habilitada la autenticación:
fuente
Crea un archivo de script; escribir comandos:
En
file.js
escriba su consulta mongo:fuente
Qué tal esto:
fuente
.mongorc
se ha cargado ( docs.mongodb.org/manual/reference/program/mongo/… )Según lo sugerido
theTuxRacer
, puede usar el comando eval , para aquellos que lo faltan como yo, también puede agregar su nombre de base de datos si no está tratando de preformar la operación en la base de datos predeterminada.fuente
Gracias
printf
! En un entorno Linux, aquí hay una mejor manera de hacer que solo un archivo ejecute el programa. Digamos que tiene dos archivos,mongoCmds.js
con múltiples comandos:y luego el archivo shell del controlador,
runMongoCmds.sh
En su lugar, tenga solo un archivo, runMongoCmds.sh que contenga
Bash
printf
es mucho más robusto queecho
y permite que los\n
comandos entre los fuercen en varias líneas.fuente
fuente
En mi caso, puedo usar convenientemente
\n
como separador para el próximo comando mongo que quiero ejecutar y luego canalizarlos amongo
fuente
--la bandera también se puede usar para archivos javascript
fuente
mongo /path/to/jsfile/test.js
Ejecutará el js también.fuente
Recientemente migró de mongodb a Postgres. Así es como usé los scripts.
Lea la
scripts.js
redirección de salida y haciainserts.sql
.scripts.js
Se ve como estoinserts.sql
Se ve como estofuente
How to execute mongo commands through shell scripts?
Esto no está fuera de tema. De hecho, llegué a esta pregunta debido al título. Entonces, la gente como yo se beneficia al leer esa respuesta. Además, estoy dando un método muy útil en el ejemplo en lugar de un ejemplo de juguete.Si desea manejarlo con una línea, es una manera fácil.
fuente
Yo escribí las diversas opciones para ejecutar una secuencia de comandos shell Mongo desde un script Bash más grande
fuente
Solución de script de shell único con capacidad para pasar argumentos mongo (
--quiet
, dbname, etc.):La
-S
bandera podría no funcionar en todas las plataformas.fuente
Cuando utilizo un conjunto de réplicas, las escrituras deben realizarse en PRIMARY, por lo que generalmente uso una sintaxis como esta que evita tener que averiguar qué host es el maestro:
mongo -host myReplicaset/anyKnownReplica
fuente