MongoDB | ||
---|---|---|
Información general | ||
Tipo de programa | Base de datos, NoSQL | |
Desarrollador | MongoDB Inc. | |
Modelo de desarrollo | Software libre | |
Lanzamiento inicial | 2009 | |
Información técnica | ||
Programado en | C++ | |
Versiones | ||
Última versión estable | 8.0.02 de octubre de 2024 | |
Última versión en pruebas | 4.3.03 de junio de 2019 | |
Enlaces | ||
MongoDB (del inglés humongous, "enorme"[cita requerida]) es un sistema de base de datos NoSQL, orientado a documentos y de código abierto.
En lugar de guardar los datos en tablas, tal y como se hace en las bases de datos relacionales, MongoDB guarda estructuras de datos BSON (una especificación similar a JSON) con un esquema dinámico, haciendo que la integración de los datos en ciertas aplicaciones sea más fácil y rápida.
MongoDB es una base de datos adecuada para su uso en producción y con múltiples funcionalidades. Esta base de datos se utiliza mucho en la industria,[1] contando con implementaciones en empresas como MTV Network,[2] Craigslist,[3] Foursquare.[4]
El código fuente está disponible para los sistemas operativos Windows, GNU/Linux, OS X y Solaris.
El desarrollo de MongoDB comenzó en 2007 de la mano de 10gen Inc. (ahora llamada MongoDB Inc.)[5] cuando desarrollaban una plataforma como servicio (PaaS) similar al conocido Google App Engine.[6] En 2009 MongoDB fue lanzado como un producto independiente y publicado bajo la licencia de código abierto AGPL.[7]
En marzo de 2011, se lanzó la versión 1.4 y se consideró ya como una base de datos lista para su uso en producción.[8]
En julio de 2022 se lanzó la versión 6.0 y el 15 de agosto de 2023 la versión 7.0.
MongoDB se puede obtener de forma gratuita bajo la licencia pública general de Affero (AGPL) de GNU.[7] Los drivers para los lenguajes de programación están bajo la licencia de Apache. Además de estas licencias, MongoDB Inc. ofrece una licencia comercial que incluye características avanzadas (como integración con SASL, LDAP, Kerberos,[9] Simple Network Management Protocol[10] y búsqueda de texto de Rosette Linguistics Platform de Basis Technology[11]), herramientas de gestión, monitorización y backup, así como soporte.[12]
MongoDB soporta la búsqueda por campos, consultas de rangos y expresiones regulares. Las consultas pueden devolver un campo específico del documento pero también puede ser una función definida por el usuario para su mejor ocupación.
Cualquier campo en un documento de MongoDB puede ser indexado, al igual que es posible hacer índices secundarios. El concepto de índices en MongoDB es similar al empleado en base de datos relacionales.
MongoDB soporta el tipo de replicación primario-secundario. Cada grupo de primario y sus secundarios se denomina replica set.[13] El primario puede ejecutar comandos de lectura y escritura. Los secundarios replican los datos del primario y sólo se pueden usar para lectura o para copia de seguridad, pero no se pueden realizar escrituras. Los secundarios tienen la habilidad de poder elegir un nuevo primario en caso de que el primario actual deje de responder.
MongoDB puede escalar de forma horizontal usando el concepto de shard .[14] El desarrollador elige una clave de sharding, la cual determina cómo serán distribuidos los datos de una colección. Los datos son divididos en rangos (basado en la clave de sharding) y distribuidos a través de múltiples shard. Cada shard puede ser una réplica set. MongoDB tiene la capacidad de ejecutarse en múltiple servidores, balanceando la carga y/o replicando los datos para poder mantener el sistema funcionando en caso de que exista un fallo de hardware. La configuración automática es fácil de implementar bajo MongoDB y se pueden agregar nuevas servidores a MongoDB con el sistema de base de datos funcionando.
MongoDB puede ser utilizado como un sistema de archivos, aprovechando la capacidad de MongoDB para el balanceo de carga y la replicación de datos en múltiples servidores. Esta funcionalidad, llamada GridFS[15] e incluida en la distribución oficial, implementa sobre los drivers, no sobre el servidor,[16] una serie de funciones y métodos para manipular archivos y contenido. En un sistema con múltiple servidores, los archivos pueden ser distribuidos y replicados entre los mismos de forma transparente, creando así un sistema eficiente tolerante de fallos y con balanceo de carga.
MongoDB proporciona un framework de agregación que permite realizar operaciones similares al "GROUP BY" de SQL. El framework de agregación está construido como un pipeline en el que los datos van pasando a través de diferentes etapas en los cuales estos datos son modificados, agregados, filtrados y formateados hasta obtener el resultado deseado. Todo este procesado es capaz de utilizar índices si existieran y se produce en memoria. Asimismo, MongoDB proporciona una función MapReduce que puede ser utilizada para el procesamiento por lotes de datos y operaciones de agregación.
MongoDB tiene la capacidad de realizar consultas utilizando JavaScript, haciendo que estas sean enviadas directamente a la base de datos para ser ejecutadas.
Si estás desarrollando un servicio que se va haciendo popular o los niveles de acceso a base de datos son cada vez más altos, empezarás a notar que tu base de datos está siendo atacada por un tráfico creciente y tu servidor esté sufriendo por los altos niveles de estrés y te podrías ver en la necesidad de actualizar tu infraestructura para soportar la demanda.
Aquí entra en juego el sharding, es el modo en el que hacemos nuestra base de datos escalable. En lugar de tener una colección en una base de datos, la pondríamos en varias bases de datos distribuidas, de modo que a la hora de consultar los datos de dicha colección, los recuperemos como si de una única base de datos se tratase. Mongo se encargará de averiguar de manera transparente en qué base de datos se encuentran los datos.
Los fragmentos estarán formados por replica set, de modo que si creamos tres fragmentos, cada uno de los cuales tiene una replica set con tres servidores, estaríamos hablando de un total de nueve servidores.
Las consultas se realizan de manera distribuida a través de un módulo enrutador, “MongoS”, que mantiene un pool de conexiones a los distintos hosts. Para distribuir los datos de una colección ordenada, se trocea la colección en rangos a los que se les asigna un identificador (shard key), que puede ser una parte del propio documento, y se distribuye entre los replica sets.
MongoDB solo garantizaba ACID dentro del mismo documento. El no implementar las propiedades ACID generaba que la base de datos no aseguraran la durabilidad, la integridad, la consistencia y el aislamiento requeridos obligatoriamente en las transacciones. El soporte para transacciones ACID de múltiples documentos se agregó a MongoDB en la versión 4.0 de junio de 2018.
Sobre la base de este punto se detallan los cuatro siguientes:
En versiones anteriores de la base de datos las lecturas estrictamente consistentes ven versiones obsoletas de documentos, también pueden devolver datos incorrectos de lecturas que nunca deberían haber ocurrido.[17]
Este problema se considera solucionado a partir de la versión 3.4: https://jepsen.io/analyses/mongodb-3-4-0-rc3
MongoDB bloquea la base de datos a nivel de documento ante cada operación de escritura. Sólo se podrán hacer operaciones de escritura concurrentes entre distintos documentos.
MongoDB retorna cuando todavía no se ha escrito la información en el espacio de almacenamiento permanente, lo que puede ocasionar pérdidas de información. En MongoDB 2.2 se cambia el valor por defecto para escribir en al menos una réplica, pero esto sigue sin satisfacer la durabilidad ni la verificabilidad.[18]
Tiene problemas de rendimiento cuando el volumen de datos supera los 100GB.[19]
La base de datos MongoDB es adecuada para los siguientes usos:[20]
MongoDB es utilizado para uno o varios de estos casos por varias empresas.[21]
MongoDB guarda la estructura de los datos en documentos BSON con un esquema dinámico, lo que implica que no existe un esquema predefinido. Los elementos de los datos se denominan documentos y se guardan en colecciones. Una colección puede tener un número indeterminado de documentos. Comparando con una base de datos relacional, se puede decir que las colecciones son como tablas y los documentos son registros en la tabla. La diferencia es que en una base de datos relacional cada registro en una tabla tiene la misma cantidad de campos, mientras que en MongoDB cada documento en una colección puede tener diferentes campos. En un documento, se pueden agregar, eliminar, modificar o renombrar nuevos campos en cualquier momento,[22] ya que no hay un esquema predefinido. La estructura de un documento es simple y compuesta por pares llave/valor, parecido a las matrices asociativas en un lenguaje de programación, esto se debe a que MongoDB sigue el formato de JSON. En MongoDB la clave es el nombre del campo y el valor es su contenido, los cuales se separan mediante el uso de “:”, tal y como se puede ver en el siguiente ejemplo. Como valor se pueden usar números, cadenas o datos binarios como imágenes o cualquier otro.
{
"_id": ObjectId("4efa8d2b7d284dad101e4bc7"),
"Last Name": "PELLERIN",
"First Name": "Franck",
"Age": 29,
"Address": {
"Street": "1 chemin des Loges",
"City": "VERSAILLES"
}
}
En este ejemplo se puede ver que en el campo “Address” se contiene otro documento que tiene los campos de “Street” y “City”.
Según la documentación oficial de MongoDB, este sistema tiene controladores oficiales para los siguientes lenguajes de programación:
Los siguientes comandos pueden ser instalados para el manejo y la administración del sistema de base de datos: