MongoDB

Instalar MongoDB en linux

$ sudo apt install mongodb

Despues de instalado se crea la carpeta db en la ruta /data, quedando la ruta como /data/db, esta carpeta sera usada por MongoDB

Iniciar el servidor de MongoDB

$ mongod

En este caso se esta especificando el puerto 9000 como el puerto que usara el servidor, la conexión por defecto es mediante el puerto 27017

$ mongod --port 9000

Iniciar la terminal de MongoDB

Para lanzar la interfaz de terminal para interactuar con el servidor de MongoDB se ejecuta el siguiente comando

$ mongo

# Desde un puerto en especifico
$ mongo --port 9000

Mostrar las Bases de Datos existentes

Para mostrar el listado de bases de datos existentes en el servidor, es suficiente con lanzar el comando

$ show dbs

Mostrar la BD en uso

Para saber que BD se esta usando en el momento

$ db

Crear una nueva base de datos

Este comando sirve tanto para crear una nueva Base de Datos como para cambiar entre las Bases de Datos ya existentes

# use <nombre de la Base>
$ use prueba

Teniendo como punto de comparación una BD relacional que trabaja con tablas, las BD no-relacionales trabajan con colecciones.

Las reglas para nombrar una colección son las siguientes * Deben tener un nombre simple * El nombre de la colección debe estar en minúsculas * El nombre de la colección debe ser plural

Creación de una colección

# db.createCollection("nombre_de_la_colección")
$ db.createCollection("students")

Eliminar una colección

# db.nombre_de_la_colección.drop()
$ db.students.drop()

MongoDB usa algunos tipos de datos comunes para almacenar información mediante un formato llamado BSON muy parecido al formato JSON

Los tipos de datos que se pueden usar son los siguientes:

{
  string: "Cadena de texto",
  int: 404,
  double: 3.1316,
  boolean: true,
  array: [1, 2, 3],
  object: {attr1: "attr1", attr2: "attr2"},
  date: new Date("<YYYY-mm-dd>"),
  object_id: <ObjectID>,
  no_value: null,
  //Algunos otros tipos de datos
  //Timestamp
  // Datos Binarios
  // Expresiones regulares
  // Código JS
}

Insertar un valor en la colección

El método insertOne solo permite introducir un registro en la colección.

// db.nombre_de_la_colección.insertOne({llave: "valor"})
$ db.students.insertOne({nombre: "Deckon", edad: 29, promedio: 8.8})

Insertar múltiples valores en la colección

Se usa el método insertMany para introducir en la colección múltiples registros

// db.nombre_de_la_colección.insertMany([
//    {llave: "valor"},
//    {llave: "valor"}
//  ])
$ db.students.insertMany([
    {nombre: "nombreUno", edad: 1, promedio: 8},
    {nombre: "nombreDos", edad: 2, promedio: 9}
  ])

Mostrar todos los registros de la colección

Con el método find({}) se especifica que se muestren todos los datos

// db.nombre_de_la_colección.find({})
$ db.students.find({})
{ "_id" : ObjectId("5acab5c681553ea57b72866e"), "nombre" : "Deckon", "edad" : 29, "promedio" : 8.8 }
{ "_id" : ObjectId("5acab5d481553ea57b72866f"), "nombre" : "nombreUno", "edad" : 1, "promedio" : 8 }
{ "_id" : ObjectId("5acab5d481553ea57b728670"), "nombre" : "nombreDos", "edad" : 2, "promedio" : 9 }

Para generar una salida de los datos mas limpia se puede hacer uso del método pretty()

// db.nombre_de_la_colección.find({}).pretty()
$ db.students.find({}).pretty()

lo cual genera una salida como la siguiente

{
	"_id" : ObjectId("5acab5c681553ea57b72866e"),
	"nombre" : "Deckon",
	"edad" : 29,
	"promedio" : 8.8
}
{
	"_id" : ObjectId("5acab5d481553ea57b72866f"),
	"nombre" : "nombreUno",
	"edad" : 1,
	"promedio" : 8
}
{
	"_id" : ObjectId("5acab5d481553ea57b728670"),
	"nombre" : "nombreDos",
	"edad" : 2,
	"promedio" : 9
}

Limitar la salida de resultados

Se puede especificar la cantidad de resultados a mostrar con el método limit()

// db.nombre_de_la_colección.find({}).limit(2).pretty()
$ db.students.find({}).limit(2).pretty()

En este ejemplo se esta limitando la cantidad de resultados unicamente a 2 registros

Ordenar los resultados

Mediante el método sort({}) se puede especificar un orden ascendente o descendente según un campo o múltiples campos

// db.nombre_de_la_colección.find({}).sort({campo: valor}).pretty()
$ db.students.find({}).sort({nombre: 1, edad: -1}).pretty()

Esto nos ordena la salida de forma descendente según el nombre pero también de forma ascendente según la edad

Filtros

Pasándole parámetros llave: valor al método find({}) se le puede indicar un registro especifico a buscar

// db.nombre_de_la_colección.find({llave: valor}).pretty()
$ db.students.find({nombre: "Deckon"}).pretty()

Se pueden seguir pasando parámetros llave: valor para ser aun mas especifico en la búsqueda.

Or

Dentro del método find({}) se puede condicionar el filtro con el condicional or

// db.nombre_de_la_colección.find({$or: [{llave: valor}, {llave: valor}]}).pretty()
$ db.students.find({$or: [{nombre: "Deckon"}, {edad: 2}]}).pretty()

Este consulta devuelve los resultados que tengan de nombre Deckon o que tengan una edad de 2

Comparaciones

Al igual que con $or se pueden usar otros operadores para comparar y filtrar resultados

Operación Operador Acción Ejemplo
$or OR Uno u otro valor db.students.find({$or: [{nombre: “Deckon”}, {edad: 2}]}).pretty()
$eq = Compara un valor con otro db.students.find({ promedio: {$eq: 6} }).pretty()
$ne NOT No igual a db.students.find({ promedio: {$ne: 6} }).pretty()
$lt < Menor que db.students.find({ promedio: {$lt: 8} }).pretty()
$lte <= Menor o igual que db.students.find({ promedio: {$lte: 8} }).pretty()
$gt > Mayor que db.students.find({ promedio: {$gt: 8} }).pretty()
$gte >= Mayor o igual que db.students.find({ promedio: {$gte: 8} }).pretty()

Búsqueda de elementos en una lista

Se puede realizar una búsqueda a partir de elementos que se encuentren dentro de una lista

$ db.students.find({nombre: {$in: ["nombreUno", "nombreDos"]}}).pretty()

Para una búsqueda de elementos que no se encuentren dentro de la lista se usa $nin

$ db.students.find({nombre: {$nin: ["nombreUno", "nombreDos"]}}).pretty()

Búsqueda de campos únicos

Ya que MongoDB es una BD flexible, permite en cualquier momento agregar campos nuevos y únicos pertenecientes a cada registro. Para encontrar esos campos es necesario comprobar su existencia

$ db.students.find({ premio: {$exists: true} }).pretty()

En caso de existir un campo premio, regresa los resultados que contengan dicho campo.

En caso de que el valor dado a $exists fuese false, el resultado serian todos los resultados que no contengan dicho campo.

Búsqueda por tipo de dato del campo

Ya que MongoDB es flexible con los campos, puede darse el caso en que el mismo campo tenga diferentes tipos de datos por lo cual se pueden realizar búsquedas por el tipo de dato.

$ db.students.find({ nombre: {$type: 2} }).pretty()

Como se puede observar se pasa el argumento $type: con el valor 2, lo cual quiere decir que se busca el tipo de dato cadena de texto. En la documentación de BSON de MongoDB se pueden encontrar el listado de valores correspondientes al tipo de dato Listado de typos de datos BSON

Actualizar

Para actualizar la información de un solo registro se usa el método updateOne

$ db.students.updateOne({promedio: 6}, {$set: {promedio: 6.5}})

Para realizar la actualización pero en múltiples registros se cambia el método updateOne por updateMany

$ db.students.updateMany({promedio: 6}, {$set: {promedio: 6.5}})

Remplazar

Al igual que la acción de actualizar, este método en vez de actualizar un registro lo sustituye por otro

$ db.students.replaceOne({promedio: 6.5}, {nombre: "otro", edad: 5.5, promedio: 6})

Eliminar

Para eliminar un solo documento se una el método deleteOne y para múltiples registros deleteMany, con la misma lógica que la actualización o el remplazo solo se tiene que especificar el filtro para indicar que documentos son los que se van a eliminar.

$ db.students.deleteOne({promedio: 6})

Para eliminar todos los registros de un doucmento se puede realizar con

$ db.students.deleteMany({})