MongoDB es una base de datos orientada a documentos , multiplataforma y disponible en código fuente . Clasificado como un producto de base de datos NoSQL , MongoDB utiliza documentos similares a JSON con esquemas opcionales . MongoDB es desarrollado por MongoDB Inc. y las versiones actuales tienen la licencia pública del lado del servidor (SSPL). MongoDB es actualmente el quinto motor de base de datos más popular. [5]
La empresa estadounidense de software 10gen comenzó a desarrollar MongoDB en 2007 como componente de un producto de plataforma como servicio planificado . En 2009, la empresa pasó a un modelo de desarrollo de código abierto y comenzó a ofrecer soporte comercial y otros servicios. En 2013, 10gen cambió su nombre a MongoDB Inc, [6] y MongoDB ganó el premio DB-Engines de 2013 y 2014 por el motor de base de datos que obtuvo la mayor popularidad en esos años.
El 8 de noviembre de 2018 con la versión estable 4.0.4, la licencia del software cambió de AGPL 3.0 a SSPL. [7] [8]
El 30 de octubre de 2019, MongoDB Inc. se asoció con Alibaba Cloud para ofrecer a los clientes de Alibaba Cloud una solución MongoDB como servicio. Los clientes pueden utilizar la oferta gestionada desde los centros de datos globales de Alibaba. [9]
MongoDB admite consultas de campos, rangos y búsquedas de expresiones regulares . [33] Las consultas pueden devolver campos específicos de documentos y también incluir funciones JavaScript definidas por el usuario . Las consultas también se pueden configurar para devolver una muestra aleatoria de resultados de un tamaño determinado.
Los campos de un documento MongoDB se pueden indexar con índices primarios y secundarios.
MongoDB proporciona alta disponibilidad con conjuntos de réplicas. [34] Un conjunto de réplicas consta de dos o más copias de los datos. Cada miembro del conjunto de réplicas puede actuar en el rol de réplica primaria o secundaria en cualquier momento. Todas las escrituras y lecturas se realizan en la réplica principal de forma predeterminada. Las réplicas secundarias mantienen una copia de los datos de la principal mediante la replicación integrada. Cuando falla una réplica principal, el conjunto de réplicas lleva a cabo automáticamente un proceso de elección para determinar qué secundaria debe convertirse en la principal. Los secundarios pueden opcionalmente servir operaciones de lectura, pero esos datos solo eventualmente son consistentes de forma predeterminada.
Si la implementación de MongoDB replicada solo tiene un único miembro secundario, se debe agregar al conjunto un demonio separado llamado árbitro. Tiene la responsabilidad única de resolver la elección de las nuevas primarias. [35] Como consecuencia, una implementación distribuida ideal de MongoDB requiere al menos tres servidores separados, incluso en el caso de solo uno primario y otro secundario. [35]
MongoDB escala horizontalmente usando fragmentación . [36] El usuario elige una clave de fragmento, que determina cómo se distribuirán los datos de una colección. Los datos se dividen en rangos (según la clave del fragmento) y se distribuyen en varios fragmentos, que son maestros con una o más réplicas. Alternativamente, la clave del fragmento se puede aplicar mediante hash para asignarla a un fragmento, lo que permite una distribución uniforme de los datos.
MongoDB puede ejecutarse en varios servidores, equilibrando la carga o duplicando datos para mantener el sistema funcional en caso de falla del hardware.
MongoDB se puede utilizar como un sistema de archivos , llamado GridFS, con funciones de equilibrio de carga y replicación de datos en múltiples máquinas para almacenar archivos.
Esta función, denominada sistema de archivos grid , [37] se incluye con los controladores MongoDB. MongoDB expone funciones para la manipulación de archivos y contenido a los desarrolladores. Se puede acceder a GridFS utilizando la utilidad mongofiles o complementos para Nginx [38] y lighttpd . [39] GridFS divide un archivo en partes o fragmentos y almacena cada uno de esos fragmentos como un documento separado. [40]
MongoDB proporciona tres formas de realizar la agregación: el canal de agregación, la función de reducción de mapas y los métodos de agregación de propósito único. [41]
Map-reduce se puede utilizar para el procesamiento por lotes de datos y operaciones de agregación. Sin embargo, según la documentación de MongoDB, el canal de agregación proporciona un mejor rendimiento para la mayoría de las operaciones de agregación. [42]
El marco de agregación permite a los usuarios obtener resultados similares a los devueltos por consultas que incluyen la cláusula SQL GROUP BY. Los operadores de agregación se pueden unir para formar una canalización, análoga a las canalizaciones de Unix . El marco de agregación incluye el operador $lookup, que puede unir documentos de múltiples colecciones, así como operadores estadísticos como la desviación estándar.
JavaScript se puede utilizar en consultas, funciones de agregación (como MapReduce ) y enviarse directamente a la base de datos para su ejecución.
MongoDB admite colecciones de tamaño fijo llamadas colecciones limitadas. Este tipo de colección mantiene el orden de inserción y, una vez alcanzado el tamaño especificado, se comporta como una cola circular .
MongoDB admite transacciones ACID de múltiples documentos desde la versión 4.0 en junio de 2018. [43]
MongoDB Community Edition es gratuita y está disponible para Windows, Linux y macOS. [44]
MongoDB Enterprise Server es la edición comercial de MongoDB y está disponible como parte de la suscripción MongoDB Enterprise Advanced. [45]
MongoDB también está disponible como un servicio totalmente gestionado bajo demanda. MongoDB Atlas se ejecuta en AWS, Microsoft Azure y Google Cloud Platform. [46]
El 10 de marzo de 2022, MongoDB advirtió a sus usuarios en Rusia y Bielorrusia que sus datos almacenados en la plataforma MongoDB Atlas serán destruidos como resultado de las sanciones estadounidenses relacionadas con la guerra ruso-ucraniana . [47]
MongoDB tiene controladores oficiales para los principales lenguajes de programación y entornos de desarrollo. [48] También hay una gran cantidad de controladores no oficiales o respaldados por la comunidad para otros lenguajes y marcos de programación.
La interfaz principal de la base de datos ha sido el shell mongo. Desde MongoDB 3.2, MongoDB Compass se introduce como la GUI nativa. Existen productos y proyectos de terceros que ofrecen interfaces de usuario para administración y visualización de datos. [49]
A partir de octubre de 2018, MongoDB se publica bajo la Licencia pública del lado del servidor (SSPL), una licencia no gratuita desarrollada por el proyecto. Reemplaza la Licencia Pública General GNU Affero y es casi idéntica a la Licencia Pública General GNU versión 3 , pero requiere que aquellos que ponen el software a disposición del público como parte de un "servicio" deben hacer que el código fuente completo del servicio (en la medida en que un usuario podrían recrear el servicio ellos mismos) disponibles bajo esta licencia. Por el contrario, la AGPL sólo exige que se proporcione a los usuarios el código fuente del software con licencia cuando el software se transmite a través de una red. [50] [51] El SSPL se presentó para certificación a la Open Source Initiative pero luego se retiró. [52] En enero de 2021, la Open Source Initiative declaró que SSPL no es una licencia de código abierto. [53] Los controladores de idioma están disponibles bajo una licencia Apache . Además, MongoDB Inc. ofrece licencias propietarias para MongoDB. Las últimas versiones licenciadas como AGPL versión 3 son 4.0.3 (estable) y 4.1.4. [54]
MongoDB ha sido eliminado de las distribuciones Debian , Fedora y Red Hat Enterprise Linux debido al cambio de licencia. Fedora determinó que la versión 1 de SSPL no es una licencia de software libre porque está "diseñada intencionalmente para ser agresivamente discriminatoria" hacia los usuarios comerciales. [55] [56]
Debido a la configuración de seguridad predeterminada de MongoDB, que permite a cualquier usuario acceso completo a la base de datos, se han robado datos de decenas de miles de instalaciones de MongoDB. Además, muchos servidores MongoDB han sido retenidos para pedir rescate . [57] [58] En septiembre de 2017, Davi Ottenheimer, jefe de seguridad de productos en MongoDB, proclamó que se habían tomado medidas para defenderse contra estos riesgos. [59]
Desde la versión MongoDB 2.6 en adelante, los binarios de los paquetes oficiales MongoDB RPM y DEB se vinculan a localhost de forma predeterminada. Desde MongoDB 3.6, este comportamiento predeterminado se extendió a todos los paquetes de MongoDB en todas las plataformas. Como resultado, se deniegan todas las conexiones de red a la base de datos a menos que un administrador las configure explícitamente. [60]
En algunos escenarios de falla en los que una aplicación puede acceder a dos procesos distintos de MongoDB que no pueden acceder entre sí, es posible que MongoDB devuelva lecturas obsoletas. También es posible que MongoDB revierta las escrituras que han sido reconocidas. [61] El problema se solucionó en la versión 3.4.0, lanzada en noviembre de 2016, [62] y se aplicó a versiones anteriores desde la v3.2.12 en adelante. [63]
Antes de la versión 2.2, los bloqueos se implementaban por proceso de servidor. Con la versión 2.2, los bloqueos se implementaron a nivel de base de datos. [64] A partir de la versión 3.0, [65] hay disponibles motores de almacenamiento conectables y cada motor de almacenamiento puede implementar bloqueos de manera diferente. [65] Con MongoDB 3.0, los bloqueos se implementan en el nivel de colección para el motor de almacenamiento MMAPv1, [66] mientras que el motor de almacenamiento WiredTiger utiliza un protocolo de concurrencia optimista que proporciona efectivamente bloqueo a nivel de documento. [67] Incluso con versiones anteriores a la 3.0, un enfoque para aumentar la concurrencia es utilizar fragmentación . [68] En algunas situaciones, las lecturas y escrituras ceden sus bloqueos. Si MongoDB predice que es poco probable que una página esté en la memoria, las operaciones se bloquearán mientras se cargan las páginas. El uso del rendimiento de bloqueo se amplió enormemente en la versión 2.2. [69]
Hasta la versión 3.3.11, MongoDB no podía realizar una clasificación basada en intercalación y estaba limitada a la comparación byte a través de memcmp , lo que no proporcionaba un orden correcto para muchos idiomas distintos del inglés cuando se usaba con una codificación Unicode . El problema se solucionó el 23 de agosto de 2016.
Antes de MongoDB 4.0, las consultas a un índice no eran atómicas. Es posible que se pierdan los documentos que se actualizaron mientras se ejecutaban las consultas. [70] La introducción de la preocupación por la lectura de instantáneas en MongoDB 4.0 eliminó este riesgo. [71]
MongoDB afirmó que la versión 3.6.4 había pasado "las pruebas de coherencia, corrección y seguridad de datos más estrictas de la industria" realizadas por Jepsen, y que "MongoDB ofrece una de las garantías de seguridad, corrección y coherencia de datos más sólidas de cualquier base de datos disponible en la actualidad". [72] Jepsen, que se describe a sí misma como una "empresa de investigación de seguridad de sistemas distribuidos", cuestionó ambas afirmaciones en Twitter, diciendo: "En ese informe, MongoDB perdió datos y violó la causalidad por defecto". En su informe de mayo de 2020 sobre la versión 4.2.6 de MongoDB, Jepsen escribió que MongoDB solo había mencionado las pruebas que había pasado la versión 3.6.4, y que la versión 4.2.6 había introducido más problemas. [73] El resumen de la prueba de Jepsen dice en parte:
Jepsen evaluó la versión 4.2.6 de MongoDB y descubrió que incluso en los niveles más altos de preocupación de lectura y escritura, no lograba preservar el aislamiento de las instantáneas. En cambio, Jepsen observó lecturas sesgadas, flujo de información cíclico, escrituras duplicadas y violaciones de coherencia interna. Los valores predeterminados débiles significaban que las transacciones podían perder escrituras y permitir lecturas sucias, incluso degradando los niveles de seguridad solicitados a nivel de base de datos y colección. Además, la preocupación por la lectura de instantáneas no garantizaba la instantánea a menos que se combinara con la preocupación por la escritura mayoritaria, incluso para transacciones de solo lectura. Estas opciones de diseño complican el uso seguro de las transacciones de MongoDB. [74]
El 26 de mayo, Jepsen actualizó el informe para decir: "MongoDB identificó un error en el mecanismo de reintento de transacciones que creen que fue responsable de las anomalías observadas en este informe; está programado un parche para 4.2.8". [74] El problema ha sido solucionado a partir de esa versión, y "las críticas de Jepsen sobre los problemas de escritura predeterminados también se han abordado, con el problema de escritura predeterminado ahora elevado a preocupación mayoritaria (w:majority) desde MongoDB 5.0". [75]
MongoDB Inc. organiza una conferencia anual de desarrolladores que se llama MongoDB World o MongoDB.live. [76]