MongoDB es un programa de base de datos multiplataforma , orientado a documentos y disponible en código fuente . Clasificado como un producto de base de datos NoSQL , MongoDB utiliza documentos de tipo JSON con esquemas opcionales . MongoDB es desarrollado por MongoDB Inc. y las versiones actuales tienen licencia de Server Side Public License (SSPL). MongoDB es miembro de MACH Alliance .
La empresa de software estadounidense 10gen comenzó a desarrollar MongoDB en 2007 como un componente de un producto de plataforma como servicio planificado . En 2009, la empresa cambió 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. [5]
El 20 de octubre de 2017, MongoDB se convirtió en una empresa que cotiza en bolsa, listada en NASDAQ como MDB con un precio de salida a bolsa de 24 dólares por acción. [6]
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 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 administrada desde los centros de datos globales de Alibaba. [9]
MongoDB admite búsquedas de campos, consultas de rangos y expresiones regulares . [31] Las consultas pueden devolver campos específicos de documentos y también incluir funciones de 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. [32] Un conjunto de réplicas consta de dos o más copias de los datos. Cada miembro del conjunto de réplicas puede actuar como réplica principal 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 réplica principal mediante la replicación integrada. Cuando una réplica principal falla, el conjunto de réplicas realiza automáticamente un proceso de elección para determinar qué réplica secundaria debe convertirse en la principal. Las réplicas secundarias pueden realizar operaciones de lectura de forma opcional, pero esos datos solo son consistentes en última instancia de forma predeterminada.
Si la implementación replicada de MongoDB solo tiene un único miembro secundario, se debe agregar al conjunto un demonio independiente llamado árbitro. Este tiene la única responsabilidad de resolver la elección del nuevo miembro principal. [33] Como consecuencia, una implementación distribuida ideal de MongoDB requiere al menos tres servidores independientes, incluso en el caso de solo un miembro principal y uno secundario. [33]
MongoDB se escala horizontalmente mediante fragmentación . [34] 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 de fragmento) y se distribuyen entre varios fragmentos, que son maestros con una o más réplicas. Alternativamente, la clave de fragmento se puede codificar para asignarla a un fragmento, lo que permite una distribución uniforme de los datos.
MongoDB puede ejecutarse en múltiples 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, llamada sistema de archivos de cuadrícula , [35] está incluida en los controladores de 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 [36] y lighttpd . [37] GridFS divide un archivo en partes, o fragmentos, y almacena cada uno de esos fragmentos como un documento separado. [38]
MongoDB ofrece tres formas de realizar agregación: la canalización de agregación, la función map-reduce y los métodos de agregación de propósito único. [39]
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, la canalización de agregación ofrece un mejor rendimiento para la mayoría de las operaciones de agregación. [40]
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 tuberías de Unix . El marco de agregación incluye el operador $lookup, que puede unir documentos de varias 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 enviar directamente a la base de datos para su ejecución.
MongoDB admite colecciones de tamaño fijo denominadas colecciones limitadas. Este tipo de colección mantiene el orden de inserción y, una vez que se alcanza el tamaño especificado, se comporta como una cola circular .
MongoDB admite transacciones ACID de múltiples documentos desde el lanzamiento de la versión 4.0 en junio de 2018. [41]
La MongoDB Community Edition es gratuita y está disponible para Windows, Linux y macOS. [42]
MongoDB Enterprise Server es la edición comercial de MongoDB y está disponible como parte de la suscripción a MongoDB Enterprise Advanced. [43]
MongoDB también está disponible como un servicio totalmente administrado y bajo demanda. MongoDB Atlas se ejecuta en AWS, Microsoft Azure y Google Cloud Platform. [44]
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 . [45]
MongoDB tiene controladores oficiales para los principales lenguajes de programación y entornos de desarrollo. [46] También hay una gran cantidad de controladores no oficiales o compatibles con la comunidad para otros lenguajes y marcos de programación.
La interfaz principal de la base de datos ha sido el shell de Mongo. Desde MongoDB 3.2, MongoDB Compass se presenta como la interfaz gráfica de usuario nativa. Existen productos y proyectos de terceros que ofrecen interfaces de usuario para la administración y visualización de datos. [47]
A partir de octubre de 2018, MongoDB se lanzó bajo la Licencia Pública del Lado del Servidor (SSPL), una licencia no libre desarrollada por el proyecto. Reemplaza la Licencia Pública General Affero de GNU y es casi idéntica a la Licencia Pública General de GNU versión 3 , pero requiere que quienes hagan que el software esté disponible públicamente como parte de un "servicio" deben hacer que el código fuente completo del servicio (en la medida en que un usuario pueda recrear el servicio por sí mismo) esté disponible bajo esta licencia. Por el contrario, la AGPL solo requiere 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. [48] [49] La SSPL se presentó para su certificación a la Iniciativa de Código Abierto, pero luego se retiró. [50] En enero de 2021, la Iniciativa de Código Abierto declaró que la SSPL no es una licencia de código abierto. [51] Los controladores de lenguaje 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. [52]
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. [53] [54]
Debido a la configuración de seguridad predeterminada de MongoDB, que permite a cualquier usuario tener acceso completo a la base de datos, se han robado datos de decenas de miles de instalaciones de MongoDB. Además, muchos servidores de MongoDB han sido tomados como rehenes . [55] [56] En septiembre de 2017, Davi Ottenheimer, jefe de seguridad de productos en MongoDB, proclamó que se habían tomado medidas para defenderse de estos riesgos. [57]
A partir de la versión 2.6 de MongoDB, los archivos binarios de los paquetes RPM y DEB oficiales de MongoDB se vinculan a localhost de forma predeterminada. A partir de la versión 3.6 de MongoDB, este comportamiento predeterminado se extendió a todos los paquetes de MongoDB en todas las plataformas. Como resultado, se deniegan todas las conexiones en red a la base de datos a menos que un administrador las configure explícitamente. [58]
En algunos escenarios de falla en los que una aplicación puede acceder a dos procesos MongoDB distintos que no pueden acceder entre sí, es posible que MongoDB devuelva lecturas obsoletas. También es posible que MongoDB revierta escrituras que se han reconocido. [59] El problema se solucionó en la versión 3.4.0, publicada en noviembre de 2016, [60] y se aplicó a versiones anteriores a partir de la v3.2.12. [61]
Antes de la versión 2.2, los bloqueos se implementaban en función de cada proceso del servidor. Con la versión 2.2, los bloqueos se implementaron a nivel de base de datos. [62] A partir de la versión 3.0, [63] están disponibles motores de almacenamiento conectables, y cada motor de almacenamiento puede implementar bloqueos de manera diferente. [63] Con MongoDB 3.0, los bloqueos se implementan a nivel de colección para el motor de almacenamiento MMAPv1, [64] mientras que el motor de almacenamiento WiredTiger utiliza un protocolo de concurrencia optimista que proporciona efectivamente bloqueo a nivel de documento. [65] Incluso con versiones anteriores a la 3.0, un enfoque para aumentar la concurrencia es utilizar sharding . [66] En algunas situaciones, las lecturas y escrituras producirán sus bloqueos. Si MongoDB predice que es poco probable que una página esté en la memoria, las operaciones producirán su bloqueo mientras se cargan las páginas. El uso de la producción de bloqueos se expandió enormemente en la versión 2.2. [67]
Hasta la versión 3.3.11, MongoDB no podía realizar una ordenación basada en intercalación y se limitaba a la comparación byte a byte mediante memcmp , lo que no proporcionaba una ordenación correcta para muchos idiomas distintos del inglés cuando se utilizaba con una codificación Unicode . El problema se solucionó el 23 de agosto de 2016.
Antes de MongoDB 4.0, las consultas sobre un índice no eran atómicas. Los documentos que se actualizaban mientras se ejecutaban las consultas podían pasarse por alto. [68] La introducción del problema de lectura de instantáneas en MongoDB 4.0 eliminó este riesgo. [69]
MongoDB afirmó que la versión 3.6.4 había pasado "las pruebas de seguridad, corrección y consistencia de datos más duras de la industria" realizadas por Jepsen, y que "MongoDB ofrece una de las garantías de consistencia, corrección y seguridad de datos más sólidas de cualquier base de datos disponible en la actualidad". [70] Jepsen, que se describe a sí misma como una "empresa de investigación de seguridad de sistemas distribuidos", refutó 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 pruebas que la versión 3.6.4 había pasado, y que la versión 4.2.6 había introducido más problemas. [71] 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 por la lectura y la escritura, no lograba preservar el aislamiento de las instantáneas. En cambio, Jepsen observó sesgo de lectura, flujo de información cíclico, escrituras duplicadas y violaciones de la consistencia 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 mayoría de preocupaciones por la escritura, incluso para transacciones de solo lectura. Estas opciones de diseño complican el uso seguro de las transacciones de MongoDB. [72]
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; se ha programado un parche para la versión 4.2.8". [72] El problema se ha solucionado a partir de esa versión, y "las críticas de Jepsen sobre las preocupaciones por la escritura predeterminada también se han abordado, y la preocupación por la escritura predeterminada ahora se ha elevado a la preocupación mayoritaria (w:majority) a partir de MongoDB 5.0". [73]
MongoDB Inc. organiza una conferencia anual para desarrolladores denominada MongoDB World o MongoDB.live. [74]