Supongamos que hemos instalado MongoDB desde paquete en Debian/Devuan y derivados (ejecutando por ejemplo apt-get install mongodb) y necesitamos crear un usuario y base de datos para una aplicación. Este artículo explica cómo hacerlo en simples pasos desde línea de comandos.



MongoDB es un sistema de gestión de bases de datos orientado a documentos libre y open source. Está clasificado como motor NoSQL y utiliza un formato estilo JSON para los documentos.

Luego de instalar MongoDB en un sistema Debian/Devuan o derivado, éste escucha por defecto en el puerto TCP 27017 y a su vez localmente en un socket Unix:

root@devuan:~# netstat -tuxlp | grep mongo
tcp        0      0 localhost:27017         0.0.0.0:*               LISTEN      11088/mongod        
unix  2      [ ACC ]     STREAM     LISTENING     23198    11088/mongod         /tmp/mongodb-27017.sock

Esta es la comprobación mínima para saber si MongoDB está funcionando. Digamos que hemos instalado MongoDB pero no sabemos que hacer. Seguramente alguna aplicación necesitará conectarse al servidor y comenzar a insertar documentos.

El paquete "mongodb" provee el cliente de línea de comandos mongo, el cual permite gestionar el motor desde una shell en Linux. Similar al caso de los clientes mysql para MySQL y psql para PostgreSQL.

De acuerdo a la página de manual de mongo, se trata de una shell interactiva basada en JavaScript que hace de interfaz a MongoDB. Sirve tanto para tareas administrativas como para testear consultas y operaciones directamente sobre una base de datos:

MONGO(1)                        mongodb-manual                       MONGO(1)

NAME
       mongo - MongoDB Shell

DESCRIPTION
       mongo  is  an interactive JavaScript shell interface to MongoDB, which
       provides a powerful interface for systems administrators as well as  a
       way  for  developers  to test queries and operations directly with the
       database. mongo also provides a fully functional  JavaScript  environ‐
       ment for use with a MongoDB. This document addresses the basic invoca‐
       tion of the mongo shell and an overview of its usage.

SYNOPSIS
       mongo [--shell] [--nodb] [--norc] [--quiet]  [--port  <port>]  [--host
       <host>]  [--eval <JavaScript>] [-u <username>] [--username <username>]
       [-p <password>]  [--password  <password>]  [--help]  [-h]  [--version]
       [--verbose] [--ipv6] [database] [file.js]

Es posible acceder a la ayuda mediante la opción --help:

root@devuan:~# mongo --help | head
MongoDB shell version: 3.2.11
usage: mongo [options] [db address] [file names (ending in .js)]
db address can be:
  foo                   foo database on local machine
  192.169.0.5/foo       foo database on 192.168.0.5 machine
  192.169.0.5:9999/foo  foo database on 192.168.0.5 machine on port 9999
Options:
  --shell                             run the shell after executing files
  --nodb                              don't connect to mongod on startup - no 
                                      'db address' arg expected

Para comenzar a trabajar con la shell, simplemente ejecutar mongo:

root@devuan:~# mongo
MongoDB shell version: 3.2.11
connecting to: test
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see
        http://docs.mongodb.org/
Questions? Try the support group
        http://groups.google.com/group/mongodb-user
> 

El subcomando help muestra una breve ayuda de comandos y métodos:

> help
        db.help()                    help on db methods
        db.mycoll.help()             help on collection methods
        sh.help()                    sharding helpers
        rs.help()                    replica set helpers
        help admin                   administrative help
        help connect                 connecting to a db help
        help keys                    key shortcuts
        help misc                    misc things to know
        help mr                      mapreduce

        show dbs                     show database names
        show collections             show collections in current database
        show users                   show users in current database
        show profile                 show most recent system.profile entries with time >= 1ms
        show logs                    show the accessible logger names
        show log [name]              prints out the last segment of log in memory, 'global' is default
        use <db_name>                set current database
        db.foo.find()                list objects in collection foo
        db.foo.find( { a : 1 } )     list objects in foo where a == 1
        it                           result of the last line evaluated; use to further iterate
        DBQuery.shellBatchSize = x   set default number of items to display on shell
        exit                         quit the mongo shell

El comando show dbs permite listar las bases de datos existentes:

> show dbs
local  0.000GB

Crear una base de datos

No existe un comando "create" para crear una base de datos, sino que el comando use se utiliza para cambiar la base de datos actual (igual que en MySQL). Si la base de datos no existe, use la crea automáticamente:

> use nutch
switched to db nutch
> show dbs
local  0.000GB

Sin embargo, al listar las bases de datos, se observa que nuestra nueva base de datos no aparece en el listado. Esto se debe a que la base de datos está vacía. Una vez insertado el primer documento, la base de datos aparecerá listada en la salida de show dbs.

Crear un usuario

El siguiente paso consiste en crear un usuario en nuestra nueva base de datos. Mediante db.help() es posible acceder a la ayuda de métodos relacionados a bases de datos:

> db.help()
DB methods:
        db.adminCommand(nameOrDocument) - switches to 'admin' db, and runs command [ just calls db.runCommand(...) ]
        db.auth(username, password)
        db.cloneDatabase(fromhost)
        db.commandHelp(name) returns the help for the command
        db.copyDatabase(fromdb, todb, fromhost)
        db.createCollection(name, { size : ..., capped : ..., max : ... } )
        db.createUser(userDocument)
        db.currentOp() displays currently executing operations in the db
        db.dropDatabase()
        db.eval() - deprecated
        db.fsyncLock() flush data to disk and lock server for backups
        db.fsyncUnlock() unlocks server following a db.fsyncLock()
        db.getCollection(cname) same as db['cname'] or db.cname
        db.getCollectionInfos([filter]) - returns a list that contains the names and options of the db's collections
        db.getCollectionNames()
        db.getLastError() - just returns the err msg string
        db.getLastErrorObj() - return full status object
        db.getLogComponents()
        db.getMongo() get the server connection object
        db.getMongo().setSlaveOk() allow queries on a replication slave server
        db.getName()
        db.getPrevError()
        db.getProfilingLevel() - deprecated
        db.getProfilingStatus() - returns if profiling is on and slow threshold
        db.getReplicationInfo()
        db.getSiblingDB(name) get the db at the same server as this one
        db.getWriteConcern() - returns the write concern used for any operations on this db, inherited from server object if set
        db.hostInfo() get details about the server's host
        db.isMaster() check replica primary status
        db.killOp(opid) kills the current operation in the db
        db.listCommands() lists all the db commands
        db.loadServerScripts() loads all the scripts in db.system.js
        db.logout()
        db.printCollectionStats()
        db.printReplicationInfo()
        db.printShardingStatus()
        db.printSlaveReplicationInfo()
        db.dropUser(username)
        db.repairDatabase()
        db.resetError()
        db.runCommand(cmdObj) run a database command.  if cmdObj is a string, turns it into { cmdObj : 1 }
        db.serverStatus()
        db.setLogLevel(level,<component>)
        db.setProfilingLevel(level,<slowms>) 0=off 1=slow 2=all
        db.setWriteConcern( <write concern doc> ) - sets the write concern for writes to the db
        db.unsetWriteConcern( <write concern doc> ) - unsets the write concern for writes to the db
        db.setVerboseShell(flag) display extra information in shell output
        db.shutdownServer()
        db.stats()
        db.version() current version of the server

El método db.createUser() permite crear un usuario en la base de datos actual. Es necesario asegurarse de estar conectado a la base correcta:

> db
nutch

El comando db indica el nombre de la base de datos actual.

Cabe destacar que no es posible crear usuarios en la base de datos "local".

De acuerdo al manual de MongoDB, la función db.createUser() toma como parámetro un documento de tipo "user". Este documento (como todos en MongoDB) utiliza un formato estilo JSON que requiere la presencia de las claves "user", "pwd" y "roles" (arreglo), las cuales identifican al nombre del usuario, su contraseña y roles respectivamente. Es posible indicar parámetros adicionales, los cuales son opcionales.

Los roles preexistentes (built-in) son "read", "readWrite", "dbAdmin", "dbOwner", "userAdmin", entre otros. Consultar el manual de MongoDB para más información acerca de built-in roles.

Para crear un usuario entonces, es necesario invocar al método createUser() y pasar un documento "user" como parámetro:

> db.createUser(
... {
... user: "nutch",
... pwd: "1234",
... roles: ["dbOwner"]
... }
... )
Successfully added user: { "user" : "nutch", "roles" : [ "dbOwner" ] }

La contraseña se especifica de forma plana, pero su almacenamiento varía de acuerdo a la configuración del servidor MongoDB (puede ser SHA-1 o SHA-256).

Como método de comprobación (más allá de la salida retornada por el método) es posible consultar los usuarios existentes en la base de datos actual, utilizando el comando show users:

> show users
{
        "_id" : "nutch.nutch",
        "user" : "nutch",
        "db" : "nutch",
        "roles" : [
                {
                        "role" : "dbOwner",
                        "db" : "nutch"
                }
        ]
}

Verificar el funcionamiento

Finalmente resta cerrar la sesión y verificar las nuevas credenciales:

> exit
bye
root@devuan:~#

Por ejemplo, conectarse a la nueva base de datos con el usuario recién creado mediante TCP/IP:

root@devuan:~# mongo -u nutch -p 127.0.0.1:27017/nutch
MongoDB shell version: 3.2.11
Enter password: 
connecting to: 127.0.0.1:27017/nutch
> db
nutch

¡Éxito!

Referencias


Tal vez pueda interesarte


Compartí este artículo