tutorial start example data create collection shell sh mongodb

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



start mongodb (19)

Quiero ejecutar comandos mongo en shell script.

Traté de seguir la manera test.sh

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

Cuando ejecuto el script anterior ./test.sh

Luego se establece la conexión mongo pero no se ejecutan los siguientes comandos.

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

por favor, ayúdame


- El indicador de shell también se puede utilizar para archivos javascript.

mongo --shell /path/to/jsfile/test.js


Como lo sugiere el theTuxRacer , puede usar el comando eval , para aquellos que no lo tienen como estaba, también puede agregar su nombre de db si no está intentando realizar una operación de preformado en el db predeterminado.

mongo <dbname> --eval "printjson(db.something.find())"


Crear un archivo de script; comandos de escritura:

#!/bin/sh mongo < file.js

En file.js escribe tu consulta mongo:

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


El script de shell a continuación también funcionó 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í.

function testMongoScript { mongo <<EOF use mydb db.leads.findOne() db.leads.find().count() EOF }


En caso de que tenga habilitada la autenticación:

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


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

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


En mi configuración tengo que usar:

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


Esto me funciona bajo Linux:

mongo < script.js


Gracias printf ! En un entorno Linux, aquí hay una mejor manera de hacer que solo un archivo ejecute el programa. Digamos que tienes dos archivos, mongoCmds.js con varios comandos:

use someDb db.someColl.find()

y luego el archivo shell del controlador, runMongoCmds.sh

mongo < mongoCmds.js

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

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

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


Ponga 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


Ponga su script mongo en un archivo .js .

Luego ejecuta mongo < yourFile.js

Ex:

demo.js // archivo tiene su script

use sample //db name show collections

mantener este archivo en "c: / db-scripts"

Luego, en el indicador de cmd, vaya 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>


Qué tal esto:

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


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

mongo < scripts.js > inserts.sql

Lea los scripts.js y redirija la salida a inserts.sql .

scripts.js ve así

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 ve así

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


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

file.sh --> db.EXPECTED_COLLECTION.remove("_id":1234) cat file.sh | mongo <EXPECTED_COLLECTION>


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())"


También puede evaluar un comando utilizando el indicador --eval , si se trata de un solo 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 :


Uso la sintaxis "heredoc", que menciona David Young. Pero hay una trampa:

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

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

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

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

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

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

La otra opción es escapar de la EOF, como esta:

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

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 de Mongo.

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

#!/bin/env mongo <some mongo stuff>

Hay varios problemas con esta solución:

  1. Solo funciona si está intentando hacer un script de shell mongo ejecutable desde la línea de comandos. No puedes mezclar comandos de shell regulares con comandos de shell mongo. 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 <some-js-file>", lo que significa que no le permite usar el comando "use <db>".

He intentado agregar el nombre de la base de datos al shebang, lo cual usted pensaría 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 único parámetro (como si se indicara) al comando env, y env no puede encontrarlo y ejecutarlo.

En su lugar, tiene que incrustar el cambio de base de datos dentro del script mismo, de esta manera:

#!/bin/env mongo db = db.getSiblingDB(''<db>''); <your script>

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


mongo <<EOF use <db_name> db.getCollection("<collection_name>").find({}) EOF


mongo db_name --eval "db.user_info.find().forEach(function(o) {print(o._id);})"