Docs Menu
Docs Home
/ /

Escribir scripts

Puede escribir scripts para MongoDB Shell que modifiquen datos en MongoDB o realicen operaciones administrativas. También puede empaquetar sus scripts como fragmentos para una distribución y gestión más sencilla.

Este tutorial introduce el uso de MongoDB Shell con JavaScript para acceder a MongoDB.

Puede escribir scripts para el MongoDB Shell para implementaciones alojadas en los siguientes entornos:

  • Atlas: el servicio totalmente administrado para implementaciones de MongoDB en la nube

  • MongoDB Enterprise: la versión basada en suscripción y autogestionada de MongoDB

  • MongoDB Community: la versión de MongoDB con código fuente disponible, gratuita y autogestionada

Para aprender más sobre cómo usar el MongoDB Shell para implementaciones alojadas en MongoDB Atlas, consulta Conectar a través de mongosh.

Puedes ejecutar un .js archivo desde dentro de MongoDB Shell usando el método load().

El método load() acepta rutas relativas y absolutas. Si el directorio de trabajo actual del MongoDB Shell es /data/db, y connect-and-insert.js está en el directorio /data/db/scripts, entonces las siguientes llamadas dentro del MongoDB Shell son equivalentes:

load( "scripts/connect-and-insert.js" )
load( "/data/db/scripts/connect-and-insert.js" )

El siguiente ejemplo crea y ejecuta un script que:

  • Se conecta a una instancia local que se ejecuta en el puerto por defecto.

  • Se conecta a la base de datos myDatabase.

  • Llena la colección movies con documentos de muestras.

  1. Crea un archivo llamado connect-and-insert.js con el siguiente contenido:

    db = connect( 'mongodb://localhost/myDatabase' );
    db.movies.insertMany( [
    {
    title: 'Titanic',
    year: 1997,
    genres: [ 'Drama', 'Romance' ]
    },
    {
    title: 'Spirited Away',
    year: 2001,
    genres: [ 'Animation', 'Adventure', 'Family' ]
    },
    {
    title: 'Casablanca',
    genres: [ 'Drama', 'Romance', 'War' ]
    }
    ] )
  2. Para cargar y ejecutar el archivo connect-and-insert.js, utiliza mongosh para conectar la implementación y ejecuta el siguiente comando:

    load( "connect-and-insert.js" )
  3. Para confirmar que los documentos se cargaron correctamente, utiliza la colección myDatabase y la query de la colección movies.

    use myDatabase
    db.movies.find()

Nota

No hay una ruta de búsqueda para el método load(). Si el script de destino no se encuentra en el directorio de trabajo actual ni en la ruta completa especificada, MongoDB Shell no podrá acceder al archivo.

Puede usar mongosh para ejecutar un script desde la línea de comandos sin entrar en la consola mongosh.

Para especificar el nombre del archivo, utiliza el parámetro --file o -f para especificar el nombre del archivo. Es posible que también necesites especificar información de conexión además de los parámetros --file o -f.

Tip

Si pasas un nombre de archivo a mongosh sin utilizar las banderas de parámetros, la conexión puede fallar si hay otros argumentos en la línea de comandos.

Para pasar nombres de archivos, utiliza siempre --file o -f.

El siguiente ejemplo crea scripts y los ejecuta desde la línea de comandos.

  1. Copia este script y guárdalo como loadMovies.js.

    db = connect( 'mongodb://localhost/films' );
    db.movies.insertMany( [
    {
    title: 'Titanic',
    year: 1997,
    genres: [ 'Drama', 'Romance' ]
    },
    {
    title: 'Spirited Away',
    year: 2001,
    genres: [ 'Animation', 'Adventure', 'Family' ]
    },
    {
    title: 'Casablanca',
    genres: [ 'Drama', 'Romance', 'War' ]
    }
    ] )

    Tip

    Verifica la cadena de conexión en la línea resaltada. Si tu instancia de MongoDB no se está ejecutando en localhost:27017, debes editar la cadena de conexión.

    Por ejemplo, la siguiente cadena de conexión se conecta al puerto 27500 de localhost:

    db = connect( 'mongodb://localhost:27500/films' );
  2. Copia este script y guárdalo como queryMovies.js.

    db = connect( 'mongodb://localhost/films' );
    printjson( db.movies.find( {} ) );
  3. Ejecuta los scripts desde la línea de comandos.

    mongosh --file loadMovies.js --file queryMovies.js
  4. Verifica la salida.

    Loading file: loadMovies.js
    Loading file: queryMovies.js
    [
    {
    _id: ObjectId("616f1b8092dbee425b661117"),
    title: 'Titanic',
    year: 1997,
    genres: [ 'Drama', 'Romance' ]
    },
    {
    _id: ObjectId("616f1b8092dbee425b661118"),
    title: 'Spirited Away',
    year: 2001,
    genres: [ 'Animation', 'Adventure', 'Family' ]
    },
    {
    _id: ObjectId("616f1b8092dbee425b661119"),
    title: 'Casablanca',
    genres: [ 'Drama', 'Romance', 'War' ]
    }
    ]

    El resultado del comando db.collection.find() muestra que la colección movies fue actualizada.

    Tip

    Para hacer visible la salida, utiliza printjson() para llamar a db.collection.find().

    printjson( db.movies.find( {} ) ) ;

Para ejecutar un script contra una instancia remota de mongod que requiere autenticación, especifica los detalles de conexión y autenticación además del nombre del archivo.

Por ejemplo:

mongosh --host 172.17.0.3 --port 27500 --username filmFan --password superSecret --file loadMovies.js

También puedes especificar la forma abreviada de las opciones:

mongosh --host 172.17.0.3 --port 27500 -u filmFan -p superSecret -f loadMovies.js

Tip

En shells como bash y zsh, si comienzas un comando con un espacio, no se guardará en el historial de comandos. Esto minimiza la exposición si ingresas contraseñas en la línea de comandos.

A menudo es útil terminar un script en ejecución si se lanza una excepción o en caso de resultados inesperados. Salir en un punto específico del script previene la ejecución de código innecesario y resultados potencialmente inesperados.

Para terminar un script, puede llamar al método exit(<code>), donde <code> es cualquier valor especificado por el usuario.

Como una mejor práctica, envuelva el código en un try - catch, llamando al método exit en el bloque catch. Del mismo modo, para comprobar los resultados de una query o de cualquier comando, puedes añadir una instrucción if - else y llamar al método exit si los resultados no son los esperados.

Al iniciar, mongosh verifica tu directorio HOME para un archivo JavaScript llamado .mongoshrc.js. Si se encuentra este archivo, mongosh se lee el contenido de .mongoshrc.js antes de mostrar el aviso por primera vez.

Para actualizar el aviso mongosh para mostrar los números de línea, añade el siguiente código a <your-home-directory>/.mongoshrc.js

let cmdCount = 1;
prompt = function() {
return (cmdCount++) + "> ";
}

El símbolo del sistema se verá así:

1> show collections
2> use test
3>

Para crear un registro de cuándo tu cliente mongosh se conecta a una base de datos, añade el siguiente código a <your-home-directory>/.mongoshrc.js:

db.clientConnections.insertOne( { connectTime: ISODate() } )

Cada vez que te conectas a una base de datos, el servidor MongoDB añade un documento como el siguiente a la colección clientConnections.

{
_id: ObjectId("61d4bbf0fa4c85f53418070f"),
connectTime: ISODate("2022-01-04T21:28:16.367Z")
}

El nombre actual de la base de datos es parte del mensaje predeterminado de mongosh. Para reformatear el prompt para mostrar la base de datos y el nombre de host, utiliza una función como esta:

{
const hostnameSymbol = Symbol('hostname');
prompt = () => {
if (!db[hostnameSymbol])
db[hostnameSymbol] = db.serverStatus().host;
return `${db.getName()}@${db[hostnameSymbol]}> `;
};
}

El símbolo del sistema se verá así:

admin@centos0722:27502>

Desde la MongoDB Shell o desde un archivo JavaScript, puedes instanciar conexiones a la base de datos utilizando el método Mongo():

new Mongo()
new Mongo(<host>)
new Mongo(<host:port>)

Nota

El MongoDB Shell no cuenta con soporte para el documento ClientSideFieldLevelEncryptionOptions con el método Mongo().

Considera una instancia de MongoDB ejecutándose en localhost en el puerto por defecto.

El siguiente ejemplo:

  • Instancia una nueva conexión a la instancia y

  • Establece la variable global db en myDatabase utilizando el método Mongo.getDB().

conn = Mongo();
db = conn.getDB("myDatabase");

Para conectarte a una implementación alojada en MongoDB Atlas, ejecuta el comando mongosh con tu cadena de conexión de Atlas. Por ejemplo:

mongosh "mongodb+srv://YOUR_CLUSTER_NAME.YOUR_HASH.mongodb.net/" --apiVersion YOUR_API_VERSION --username YOUR_USERNAME

Una vez que hayas establecido una conexión con tu implementación, puedes instanciar conexiones a bases de datos directamente desde el MongoDB Shell. El siguiente ejemplo:

  • Instancia una conexión con la implementación actual utilizando el método db.getMongo().

  • Establece la variable global db en myDatabase utilizando el método Mongo.getDB().

conn = db.getMongo()
db = conn.getDB("myDatabase");

Para conectarte a una instancia de MongoDB que aplica control de acceso, debe incluir las credenciales en la cadena de conexión.

El siguiente comando se conecta a una instancia de MongoDB que está:

  • Ejecutándose en localhost en el puerto por defecto, y

  • Asegurado mediante SCRAM.

conn = Mongo("mongodb://<username>:<password>@localhost:27017/<authDB>");

Nota

El MongoDB Shell redacta las credenciales del historial de comandos y de los registros.

También puedes usar el método connect() para conectarte a la instancia de MongoDB.

El siguiente comando:

  • Se conecta a la instancia de MongoDB que se está ejecutando en localhost con el puerto no por defecto 27020, y

  • Configura la variable global db.

db = connect("localhost:27020/myDatabase");

Considera la portabilidad y el entorno operativo cuando guardes scripts.

Si los detalles de la conexión están incluidos en el script:

  • No necesitas especificar la información de conexión en la línea de comando.

  • Debe usar el parámetro --nodb.

Considera una instancia mongod ejecutándose en localhost:27500.

El siguiente script imprime el número de usuarios. Copia el código y guárdalo como getUserCount.js.

db = connect( "localhost:27500/admin" );˘
printjson( db.system.users.countDocuments() );

Ejecuta getUserCount.js:

mongosh --nodb --file getUserCount.js
  • mongosh Se establece por defecto el puerto 27170.

  • mongod se está ejecutando en el puerto 27500.

  • El parámetro --nodb instruye a mongosh para ejecutar un script sin conectarse primero a una instancia de mongod.

La línea resaltada es correcta, pero getUserCount.js no se ejecutará sin --nodb porque mongosh no puede conectarse a la instancia local. Con --nodb, mongosh ejecuta getUserCount.js y utiliza la información resaltada para conectar.

Es conveniente especificar la información de conexión en tu script, pero eso también lo hace menos portátil. El script getUserCount.js deberá actualizarse para ejecutarse en una instancia remota o en una que funcione en un puerto diferente.

Para aumentar la portabilidad, usa db.getSiblingDB() y especifica la información de conexión en la línea de comandos.

El siguiente script es más portátil que getUserCount.js porque no contiene detalles específicos de conexión. Copia el código y guárdalo como portableGetUserCount.js.

db = db.getSiblingDB( "admin" );
printjson( db.system.users.countDocuments() );

Para ejecutar portableGetUserCount.js, especifica el host y el puerto en la línea de comandos:

mongosh --host 172.17.0.3 --port 27500 --file portableGetUserCount.js

Para ejecutar portableGetUserCount.js en un host o puerto diferente, cambia los detalles de conexión en la línea de comandos. A diferencia de getUserCount.js, no tienes que editar el script para ejecutar portableGetUserCount.js.

Volver

Encriptación a nivel de campo