14 cosas que me gustaría saber antes de comenzar con MongoDB

La traducción del artículo se preparó en vísperas del inicio del curso "Bases de datos no relacionales" .










Destacar:



  • Es extremadamente importante diseñar el esquema aunque es opcional en MongoDB.
  • Asimismo, los índices deben coincidir con su esquema y patrones de acceso.
  • Evite el uso de objetos grandes y matrices grandes.
  • Tenga cuidado con la configuración de MongoDB, especialmente cuando se trata de seguridad y confiabilidad.
  • MongoDB no tiene un optimizador de consultas, por lo que debe tener cuidado al realizar operaciones de consulta.


He estado trabajando con bases de datos durante mucho tiempo, pero recientemente descubrí MongoDB. Hay algunas cosas que me gustaría saber antes de empezar. Cuando una persona ya tiene experiencia en un área determinada, tiene ideas preconcebidas sobre qué son las bases de datos y qué hacen. Con la esperanza de que sea más fácil de entender para los demás, aquí hay una lista de errores comunes.



Creación del servidor MongoDB sin autenticación



Desafortunadamente, MongoDB se instala sin autenticación de forma predeterminada. Es normal que se acceda a una estación de trabajo de forma local. Pero dado que MongoDB es un sistema multiusuario al que le encanta usar grandes cantidades de memoria, es mejor si lo coloca en un servidor con tanta RAM como sea posible, incluso si solo lo va a usar para el desarrollo. La instalación en el servidor a través del puerto predeterminado puede ser problemática, especialmente si se puede ejecutar algún código javascript en la solicitud (por ejemplo, $wherecomo una idea para una inyección ).



Existen varios métodos de autenticación, pero el más sencillo es establecer una identificación de usuario / contraseña. Tome esta idea mientras piensa en una elegante autenticación basada en LDAP . En términos de seguridad, MongoDB debe mantenerse actualizado y los registros siempre deben revisarse para detectar accesos no autorizados. Por ejemplo, me gusta elegir un puerto diferente como puerto predeterminado.



Recuerde unir la superficie de ataque a MongoDB



La lista de verificación de seguridad de MongoDB contiene buenos consejos para reducir el riesgo de intrusión en la red y fuga de datos. Es fácil descartarlo y decir que un servidor de desarrollo no necesita un alto nivel de seguridad. Sin embargo, las cosas no son tan simples y esto se aplica a todos los servidores MongoDB. En particular, a menos que haya una razón de peso para usar mapReduce, groupo $ where , debe deshabilitar el uso de código JavaScript arbitrario escribiendo en el archivo de configuración javascriptEnabled:false. Dado que los archivos de datos no están cifrados en MongoDB estándar, tiene sentido ejecutar MongoDB con un usuario dedicado que tenga acceso completo a los archivos, con acceso limitado solo para él y la capacidad de usar los controles de acceso a archivos del propio sistema operativo.



Error de diseño de circuito



MongoDB no usa esquema. Pero esto no significa que el circuito no sea necesario. Si solo desea almacenar documentos sin un diseño coherente, guardar puede ser rápido y fácil, pero recuperarlos más tarde puede ser muy difícil . Vale la pena leer el



artículo clásico “ 6 reglas generales para el diseño de esquemas de MongoDB” , mientras que vale la pena usar características como el Explorador de esquemas en la herramienta de terceros de Studio 3T para la validación regular del esquema.



No olvide el orden de clasificación



Olvidar el orden de clasificación puede ser el más frustrante y derrochador de cualquier otra configuración incorrecta. MongoBD usa ordenamiento binario por defecto . Pero es poco probable que le sea útil a nadie. Los tipos binarios sensibles a mayúsculas y minúsculas, sensibles al estrés, se consideraban anacronismos curiosos, junto con cuentas, caftanes y bigotes rizados, en la década de 1980. Ahora su uso es imperdonable. En la vida real, "motocicleta" es lo mismo que "motocicleta". Y "Gran Bretaña" y "Gran Bretaña" son el mismo lugar. Una letra minúscula es simplemente el equivalente en mayúsculas de una letra mayúscula. Y no me hagas hablar de clasificación diacrítica. Use la intercalación que no distingue entre mayúsculas y minúsculas al crear una base de datos en MongoDBque correspondan al idioma y la cultura de los usuarios del sistema . Esto facilita mucho la búsqueda de datos de cadenas.



Crear colecciones con documentos grandes



MongoDB se complace en alojar documentos grandes de hasta 16 MB de tamaño en colecciones, y GridFS está diseñado para documentos grandes de más de 16 MB. Pero solo porque se pueden colocar documentos grandes allí, no es una buena idea mantenerlos allí. MongoDB funciona mejor si guarda documentos individuales de varios kilobytes de tamaño, tratándolos más como filas en una amplia tabla SQL. Los documentos grandes serán una fuente de problemas de rendimiento .



Cree documentos con matrices grandes



Los documentos pueden contener matrices. Es mejor si el número de elementos de la matriz está lejos del número de cuatro dígitos. Si se agregan elementos a la matriz con frecuencia, superará el documento que lo contiene y será necesario moverlo , lo que significa que los índices deberán actualizarse . Al volver a indexar un documento con una matriz grande, los índices a menudo se sobrescribirán, ya que para cada elemento hay un registro que almacena su índice. Esta reindexación también ocurre cuando se inserta o se elimina un documento.



MongoDB tiene un llamado "factor de relleno" que proporciona espacio para que los documentos crezcan para minimizar este problema.

Podría pensar que puede hacerlo sin indexar las matrices. Desafortunadamente, debido a la falta de índices, es posible que tenga otros problemas. Dado que los documentos se escanean de principio a fin, llevará más tiempo encontrar elementos al final de la matriz y la mayoría de las operaciones asociadas con dicho documento serán lentas .



No olvide el orden de las etapas en las cuestiones de agregación



En un sistema de base de datos optimizador de consultas, las consultas que escribe son explicaciones de lo que desea obtener, no de cómo obtenerlo. Este mecanismo funciona por analogía con el pedido en un restaurante: por lo general, solo pide un plato y no le da instrucciones detalladas al chef.



En MongoDB, instruyes al cocinero. Por ejemplo, debe asegurarse de que los datos se procesen reducelo antes posible en la canalización utilizando $matchy $project, y la clasificación se produce solo después reduce, y que la búsqueda se produce exactamente en el orden en que la necesita. Tener un optimizador de consultas que elimina el trabajo innecesario, organiza de manera óptima las etapas y selecciona el tipo de conexión puede estropearlo. En MongoDB, tiene más control a costa de la conveniencia.



Herramientas comoStudio 3T facilitará la creación de consultas de agregación en MongoDB . El editor de agregación le permite aplicar declaraciones de canalización paso a paso, así como validar la entrada y la salida en cada paso para simplificar la depuración.



Usando grabación rápida



Nunca configure los parámetros de escritura de MongoDB con alta velocidad pero baja confiabilidad. Este modo de "archivar y olvidar" parece rápido porque el comando regresa antes de que se realice la escritura. Si el sistema falla antes de que los datos se escriban en el disco, se perderán y quedarán en un estado inconsistente. Afortunadamente, MongoDB de 64 bits tiene habilitado el registro.



Los motores de almacenamiento MMAPv1 y WiredTiger utilizan el registro para evitar esto, aunque WiredTiger puede recuperarse hasta el último punto de control consistente si el registro está deshabilitado.



El diario asegura que la base de datos esté en un estado consistente después de la recuperación y retiene todos los datos hasta que se escriben en el diario. La frecuencia de las entradas se configura mediante el parámetro commitIntervalMs.



Para estar seguro de los registros, asegúrese de que el registro esté habilitado en el archivo de configuración (storage.journal.enabled)y que la frecuencia de los registros sea adecuada para la cantidad de información que puede permitirse perder.



Ordenar sin índice



Al buscar y agregar, a menudo es necesario ordenar los datos. Con suerte, esto se hace en una de las etapas finales, después de filtrar el resultado para reducir la cantidad de datos que se ordenan. Aun así, necesita un índice para ordenar . Puede utilizar un índice único o múltiple.



Si no hay un índice adecuado, MongoDB se las arreglará sin él. Hay un límite de memoria de 32 MB en el tamaño total de todos los documentos en una operación de clasificación , y si MongoDB alcanza este límite, arrojará un error o devolverá un juego de registros vacío .



Búsqueda sin soporte de índice



Las consultas de búsqueda realizan una función similar a la operación JOIN en SQL. Para obtener el mejor rendimiento, necesitan el índice del valor de clave utilizado como clave externa. Esto no es obvio ya que el uso no se refleja en el explain(). Dichos índices se suman al índice escrito explain(), que a su vez es utilizado por los operadores de la canalización $matchy $sort, cuando se producen al principio de la canalización. Los índices ahora pueden cubrir cualquier etapa del proceso de agregación .



Optar por no utilizar la actualización múltiple



El método se db.collection.update()utiliza para cambiar una parte de un documento existente o un documento completo, hasta un reemplazo completo, según el parámetro que especifique update. No es tan obvio que no procesará todos los documentos de la colección hasta que establezca la opción multipara actualizar todos los documentos que cumplan con los criterios de consulta.



No olvide la importancia del orden de las claves en la tabla hash



En JSON, un objeto consiste en una colección desordenada de cero o más pares de nombre / valor, donde el nombre es una cadena y el valor es una cadena, número, booleano, cero, objeto o matriz.



Desafortunadamente, BSON concede gran importancia al orden en la búsqueda. En MongoDB, el orden de las claves dentro de los objetos en línea es importante , es decir, { firstname: "Phil", surname: "factor" }No es lo mismo que { { surname: "factor", firstname: "Phil" }. Es decir, debe mantener el orden de los pares de nombre / valor en sus documentos si desea asegurarse de encontrarlos.



No confunda "nulo" y "indefinido"



El valor "indefinido" nunca fue válido en JSON de acuerdo con el estándar JSON oficial (ECMA-404, Sección 5), aunque se usa en JavaScript. Además, para BSON está obsoleto y convertido a $null, lo que no siempre es una buena solución. Evite el uso de "indefinido" en MongoDB .



Usar $limit()sin$sort()



Muy a menudo, cuando está desarrollando en MongoDB, es útil solo ver una muestra del resultado que se obtendrá de una consulta o agregación. Es útil para esta tarea $limit(), pero nunca debería estar en la versión final del código, a menos que lo use antes $sort. Esta mecánica es necesaria porque, de lo contrario, no puede garantizar el orden del resultado y no puede ver los datos de manera confiable. En la parte superior del resultado, obtendrá diferentes registros según el tipo. Para que funcionen de manera confiable, las consultas y agregaciones deben ser deterministas, es decir, producir los mismos resultados en todo momento. El código, que está $limit()presente pero no $sort, no será determinista y posteriormente puede causar errores que serán difíciles de rastrear.



Conclusión



La única forma de frustrarse con MongoDB es compararlo directamente con otro tipo de base de datos, como un DBMS, o comenzar a usarlo en función de alguna expectativa específica. Es como comparar una naranja con un tenedor. Los sistemas de bases de datos tienen objetivos específicos. Es mejor simplemente comprender y apreciar estas diferencias por sí mismo. Sería una pena presionar a los desarrolladores de MongoDB por el camino que los obligó a seguir el camino del DBMS. Quiero ver formas nuevas y emocionantes de resolver viejos problemas, como garantizar la integridad de los datos y crear sistemas de datos resistentes a fallas y ataques de usuarios malintencionados.



La implementación 4.0 de MongoDB de la transaccionalidad ACID es un buen ejemplo de cómo se están innovando importantes mejoras. Las transacciones de varios documentos y estados de cuenta ahora son atómicas. También fue posible ajustar el tiempo que lleva adquirir bloqueos y completar transacciones colgadas, así como cambiar el nivel de aislamiento.





Lee mas:






All Articles