root@Déleon:~/Informática# whoami |

Déleon Blog

MongoDB: ¿Qué es y cómo funciona?


Si hablamos de Bases de Datos lo más común es pensar en SQL y su modelo relacional, pero existen alternativas como los modelos no relacionales donde MongoDB es el más destacado.

El nombre MongoDB proviene de “Humongous” (Gigantesco) y “Database” (Base de Datos), es un sistema de base de datos NoSQL orientado a documentos de código abierto y que está escrito en C++, que en lugar de guardar los datos en tablas lo hace en estructuras de datos BSON (Binary JSON) con un esquema dinámico. Este proyecto se encuentra disponible para los sistemas operativos Windows, GNU/Linux, OS X y Solaris.

La razón de que MongoDB se encuentre en miles de proyectos en todo el mundo se debe a que, al estar escrito en C++, cuenta con una notoria capacidad para aprovechar los recursos de la máquina y, al estar licenciado bajo licencia GNU AGPL 3.0, se adapta perfectamente a nuestras necesidades.

Cómo funciona MongoDB

MongoDB es una base de datos orientada a documentos, esto quiere decir que en lugar de guardar los datos en registros, guarda los datos en documentos. Estos documentos son almacenados en BSON, que es una representación binaria de JSON, y esto representa una de las diferencias más importantes con respecto a las bases de datos relacionales. Y resulta que no es que no es necesario seguir un esquema, los documentos de una misma colección (concepto similar a una tabla de una base de datos relacional), pueden tener esquemas diferentes.

A continuación, exploraremos algunas características clave de MongoDB:

  • Documentos: Los datos se almacenan en documentos BSON, que son similares a objetos JSON. Cada documento puede tener una estructura diferente, lo que hace que MongoDB sea altamente flexible.

  • Colecciones: Los documentos se organizan en colecciones, que son similares a tablas en bases de datos relacionales.

  • Escalabilidad: MongoDB es altamente escalable y puede manejar grandes cantidades de datos y cargas de trabajo.

  • Consultas y búsquedas flexibles: MongoDB permite realizar consultas complejas y búsquedas de texto completo, lo que lo hace ideal para aplicaciones que requieren flexibilidad en la recuperación de datos.

Imaginemos que tenemos una colección a la que llamamos Libros. Un documento podría almacenarse de la siguiente manera:

{
    "title": "The Maze Runner",
    "author": "James Dashner",
    "book": 1,
    "country": "United States",
    "lenguages": "English",
    "series": "The Maze Runner Series",
    "genre": ["Young adult", "Science Fiction", "Post-Apocalyptic"],
    "published": "October 6, 2009",
    "pages": 375,
    "characters": [
        {
            "name": "Thomas",
            "books": [1, 2, 3]
        }
    ]
}

Como se puede observar, el documento es un JSON, la diferencia, es que internamente se le asignará un campo “_id” el cual será de tipo ObjectID como un identificador del documento. Este campo lo podemos modificar por cualquier valor enviandolo desde nuestro JSON.

Lo interesante viene cuando queremos almacenar en una misma colección un documento como este: { name: "Brenda", age: "17-19", gender: "Female", type: "Immune", ... }. Tal como podemos ver, este no sigue el mismo esquema del primero, añadiendo algún campo nuevo que no existe en el documento anterior o incluso de un tipo distinto, pero no importa. Algo que resulta impensable en una base de datos relacional como SQL es posible en MongoDB.

Operaciones

La manera en la que podemos utilizar las operaciones básicas de mongo, es muy sencillo.

Bases de datos

Crear y/o seleccionar una base de datos:

use my_database

Ver las bases de datos:

show databases

Eliminar la base de datos seleccionada:

db.dropDatabase()

Colecciones

Ver las colecciones:

show collections

Crear una colección:

db.createCollection("my_collection", <options>)

Los ‘options’ son opcionales:

Opción Tipo Descripción
capped Booleano Si es true, permite una colección limitada. Una colección limitada es una colección de tamaño fijo que sobrescribe automáticamente sus entradas más antiguas cuando alcanza su tamaño máximo. Si especifica true, también debe especificar el parámetro de size.
autoIndexId Booleano Si es true crea automáticamente un índice en el campo _id. Por defecto es false
size Entero Especifica el tamaño máximo en bytes para una colección limitada. Es obligatorio si el campo capped está a true.
max Entero Especifica el número máximo de documentos que están permitidos en la colección limitada.

Ejemplo de uso:

db.createCollection("my_collection", {capped : true, autoIndexId: true, size: 6142800, max: 10000})

Create, Read, Update & Delete (CRUD)

Insertar documentos en la colección: insert & insert_one

db.my_collection.insert({name: "Example", age: 30})

Realiza consultas para recuperar datos (Búsquedas): find & find_one

db.my_collection.find({name: "Example"})

Actualizar documentos: update & update_one

db.my_collection.update({name: "Example"}, {$set: {age: 30}})

Borrar documentos: remove & remove_one

db.my_collection.remove({name: "Example"})

Operadores Avanzados

Operadores de comparación

Utilizados en filtros:

Operador Descripción
$eq Coincide con valores que son iguales a un valor especificado.
$gt Coincide con valores que son mayores que un valor especificado.
$gte Coincide con valores que son mayores o iguales que un valor especificado.
$in Coincide con cualquiera de los valores especificados en una matriz.
$lt Coincide con valores que son menores que un valor especificado.
$lte Coincide con valores que son menores o iguales que un valor especificado.
$ne Coincide con todos los valores que no son iguales a un valor especificado.
$nin No coincide con ninguno de los valores especificados en una matriz.

Indexación

Los índices son fundamentales para optimizar el rendimiento de las consultas. Puedes crear índices en campos específicos para acelerar las búsquedas. Por ejemplo:

db.my_collection.createIndex({field: 1}) // Crea un índice ascendente
db.my_collection.createIndex({other_field: -1}) // Crea un índice descendente

Agregación

MongoDB permite realizar operaciones de agregación para procesar datos en la base de datos y devolver resultados calculados. Aquí hay un ejemplo de agregación que calcula el promedio de una colección:

db.my_collection.aggregate([
    { $group: { _id: null, average: { $avg: "$field" } } }
])

Consultas Avanzadas

MongoDB admite una variedad de operadores avanzados para realizar consultas más complejas. Por ejemplo, puedes usar el operador $or para buscar documentos que cumplan con una de varias condiciones:

db.my_collection.find({
    $or: [
        { field1: value1 },
        { field2: value2 }
    ]
})

Transacciones

MongoDB 4.0 y versiones posteriores admiten transacciones para garantizar la integridad de los datos en operaciones complejas que involucran varias operaciones. Puedes iniciar una transacción de la siguiente manera:

session = db.getMongo().startSession()
session.startTransaction()

// Realiza operaciones dentro de la transacción
session.commitTransaction() // Para confirmar los cambios
session.abortTransaction()  // Para deshacer los cambios
session.endSession()

Geolocalización

MongoDB es adecuado para datos geoespaciales. Puedes realizar consultas de geolocalización y encontrar documentos cercanos a una ubicación específica:

db.my_collection.find({
    location: {
        $near: {
            $geometry: {
                type: "Point",
                coordinates: [longitude, latitude]
            },
            $maxDistance: 1000 // Distancia máxima en metros
        }
    }
})

Texto Completo

Puedes realizar búsquedas de texto completo en campos de texto utilizando el índice de texto completo de MongoDB:

db.my_collection.createIndex({text_field: "text"})
db.my_collection.find({ $text: { $search: "keyword" } })



Estos son solo algunos ejemplos de comandos y operaciones más avanzados en MongoDB. La base de datos ofrece una amplia gama de funcionalidades para adaptarse a diversas necesidades.


Debemos recordar que la documentación oficial de MongoDB es una fuente valiosa para explorar aún más estas capacidades.