14 cosas que desearía saber antes de comenzar con MongoDB

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

14 cosas que desearía saber antes de comenzar con MongoDB

Aspectos destacados:

  • Es extremadamente importante desarrollar un esquema aunque sea 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 se 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 desearía saber antes de empezar a trabajar con él. Cuando una persona ya tiene experiencia en un determinado campo, tiene nociones 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, presento una lista de errores comunes.

Creando un servidor MongoDB sin autenticación

Lamentablemente, MongoDB se instala sin autenticación de forma predeterminada. Para una estación de trabajo a la que se accede localmente, esta práctica es normal. Pero como MongoDB es un sistema multiusuario al que le gusta usar grandes cantidades de memoria, será mejor si lo colocas en un servidor con la mayor cantidad de RAM posible, incluso si solo lo vas a utilizar para 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, $where como una idea para inyecciones).

Existen varios métodos de autenticación, pero el más sencillo es establecer un ID de usuario/contraseña. Utilice esta idea mientras piensa en una autenticación sofisticada basada en LDAP. Cuando se trata de seguridad, MongoDB debe actualizarse constantemente y siempre se deben verificar los registros para detectar accesos no autorizados. Por ejemplo, me gusta seleccionar un puerto diferente como puerto predeterminado.

No olvides vincular la superficie de ataque a MongoDB.

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 ignorarlo y decir que un servidor de desarrollo no necesita un alto nivel de seguridad. Sin embargo, no es tan sencillo y esto se aplica a todos los servidores MongoDB. En particular, si no hay ninguna razón convincente para utilizar mapReduce, group o $ donde, debe deshabilitar el uso de código arbitrario en JavaScript 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 Usuario dedicado, que tiene acceso completo a los archivos, con acceso limitado solo a ellos y la capacidad de utilizar los controles de acceso a archivos propios del sistema operativo.

Error al desarrollar el circuito.

MongoDB no utiliza un esquema. Pero esto no significa que el plan no sea necesario. Si solo desea almacenar documentos sin ningún patrón consistente, almacenarlos puede ser rápido y fácil, pero recuperarlos más tarde puede resultar difícil. condenadamente difícil.

Artículo clásico "Seis reglas generales para el diseño de esquemas de MongoDB" Vale la pena leerlo y características como Explorador de esquemas En la herramienta de terceros Studio 3T, vale la pena utilizarla para realizar comprobaciones periódicas de los circuitos.

No olvides el orden de clasificación

Olvidar el orden de clasificación puede causar más frustración y perder más tiempo que cualquier otra configuración incorrecta. Por defecto MongoBD utiliza clasificación binaria. Pero es poco probable que sea útil para nadie. Los tipos binarios que distinguen entre mayúsculas y minúsculas y acentos se consideraban curiosos anacronismos junto con las cuentas, los caftanes y los bigotes rizados allá por los años 80 del siglo pasado. 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úscula de una letra mayúscula. Y no me hagas empezar a clasificar los signos diacríticos. Al crear una base de datos en MongoDB, utilice la intercalación que no distinga los acentos y Registrarse, que corresponden al idioma y cultura del usuario del sistema. Esto facilitará mucho la búsqueda de datos de cadenas.

Crea colecciones con documentos grandes

MongoDB se complace en alojar documentos grandes de hasta 16 MB en colecciones, y GridFS Diseñado para documentos grandes de más de 16 MB. Pero simplemente porque se pueden colocar allí documentos de gran tamaño, almacenarlos allí no es una buena idea. MongoDB funcionará mejor si almacena documentos individuales de unos pocos kilobytes de tamaño, tratándolos más como filas en una tabla SQL amplia. Los documentos grandes serán una fuente de problemas con rendimiento.

Crear documentos con grandes matrices.

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

MongoDB tiene algo llamado "factor de llenado", lo que proporciona espacio para que los documentos crezcan para minimizar este problema.
Podría pensar que puede prescindir de la indexación de matrices. Desafortunadamente, la falta de índices puede causarle otros problemas. Dado que los documentos se escanean de principio a fin, la búsqueda de elementos al final de la matriz llevará más tiempo y la mayoría de las operaciones asociadas con dicho documento serán lento.

No olvides que el orden de las etapas en una agregación es importante.

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

En MongoDB, tú le das instrucciones al cocinero. Por ejemplo, debe asegurarse de que los datos pasen a través reduce tan pronto como sea posible en la tubería utilizando $match и $project, y la clasificación se produce sólo después reducey que la búsqueda se realice exactamente en el orden que desee. Tener un optimizador de consultas que elimine el trabajo innecesario, secuencia los pasos de manera óptima y selecciona tipos de unión puede arruinarlo. Con MongoDB, tienes más control a costa de la comodidad.

Herramientas como Estudio 3T simplificará la construcción de consultas de agregación en MongoDB. La función Editor de agregación le permite aplicar declaraciones de canalización una etapa a la vez e inspeccionar datos de entrada y salida en cada etapa para simplificar la depuración.

Usando la grabación rápida

Nunca configure las opciones de escritura de MongoDB para que tengan alta velocidad pero baja confiabilidad. este modo "archivar y olvidar" Parece rápido porque el comando se devuelve antes de que se produzca la escritura. Si el sistema falla antes de que los datos se escriban en el disco, se perderán y terminarán en un estado inconsistente. Afortunadamente, MongoDB de 64 bits tiene el registro habilitado.

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

El registro en diario garantiza que la base de datos esté en un estado coherente después de la recuperación y conserva todos los datos hasta que se escriben en el diario. La frecuencia de las grabaciones se configura mediante el parámetro commitIntervalMs.

Para estar seguro de las entradas, asegúrese de que el registro esté habilitado en el archivo de configuración. (storage.journal.enabled), y la frecuencia de las grabaciones corresponde a la cantidad de información que puede permitirse perder.

Ordenar sin índice

Al buscar y agregar, a menudo es necesario ordenar datos. Esperemos que esto se haga en una de las etapas finales, después de filtrar el resultado para reducir la cantidad de datos que se ordenan. E incluso en este caso, necesitarás ordenar índice. Puede utilizar un índice único o compuesto.

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

Buscar sin soporte de índice

Las consultas de búsqueda realizan una función similar a la operación JOIN en SQL. Para funcionar mejor, necesitan el índice del valor de la clave utilizada como clave externa. Esto no es obvio porque el uso no se refleja en explain(). Dichos índices son adicionales al índice escrito en explain(), que a su vez es utilizado por los operadores de oleoductos $match и $sort, cuando se encuentran al comienzo del oleoducto. Los índices ahora pueden cubrir cualquier etapa canalización de agregación.

Optar por no utilizar actualizaciones múltiples

método db.collection.update() Se utiliza para cambiar parte de un documento existente o el documento completo, hasta un reemplazo completo, dependiendo del parámetro que especifique. update. Lo que no es tan obvio es que no procesará todos los documentos de la colección a menos que configure la opción multi actualizar todos los documentos que cumplan con los criterios de la solicitud.

No olvides la importancia del orden de las claves en una tabla hash.

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

Lamentablemente, BSON pone mucho énfasis en el orden a la hora de realizar búsquedas. En MongoDB, el orden de las claves dentro de los objetos integrados asuntoses decir, { firstname: "Phil", surname: "factor" } - esto no es lo mismo que { { surname: "factor", firstname: "Phil" }. Es decir, debe almacenar el orden de los pares nombre/valor en sus documentos si quiere estar seguro de encontrarlos.

No confundir "nulo" и "indefinido"

Valor "indefinido" nunca fue válido en JSON, según estándar oficial JSON (ECMA-404 Sección 5), aunque se utiliza en JavaScript. Además, para BSON está obsoleto y se convierte a $null, lo que no siempre es una buena solución. Evitar el uso de "indefinido" en Mongo DB.

el uso de $limit() sin $sort()

Muy a menudo, cuando desarrollas en MongoDB, es útil ver simplemente una muestra del resultado que se devolverá de una consulta o agregación. Para esta tarea necesitarás $limit(), pero nunca debería estar en el código final a menos que lo uses antes $sort. Esta mecánica es necesaria porque de lo contrario no podrás garantizar el orden del resultado y no podrás ver los datos de manera confiable. En la parte superior del resultado obtendrás diferentes entradas según la clasificación. Para funcionar de manera confiable, las consultas y agregaciones deben ser deterministas, es decir, producir los mismos resultados cada vez que se ejecutan. Código que contiene $limit(), pero no $sort, no será determinista y posteriormente puede provocar errores que serán difíciles de localizar.

Conclusión

La única forma de decepcionarse con MongoDB es compararlo directamente con otro tipo de base de datos, como un DBMS, o empezar a utilizarlo basándose en ciertas expectativas. Es como comparar una naranja con un tenedor. Los sistemas de bases de datos sirven para propósitos específicos. Lo mejor es simplemente comprender y apreciar estas diferencias por sí mismo. Sería una pena presionar a los desarrolladores de MongoDB por un camino que los obligó a seguir el camino del DBMS. Quiero ver formas nuevas e interesantes de resolver viejos problemas, como garantizar la integridad de los datos y crear sistemas de datos que sean resistentes a fallas y ataques maliciosos.

La introducción de la transaccionalidad ACID por parte de MongoDB en la versión 4.0 es un buen ejemplo de cómo introducir mejoras importantes de una manera innovadora. Las transacciones de múltiples documentos y múltiples estados de cuenta ahora son atómicas. También es posible ajustar el tiempo necesario para adquirir bloqueos y finalizar transacciones bloqueadas, así como cambiar el nivel de aislamiento.

14 cosas que desearía saber antes de comenzar con MongoDB

Lee mas:

Fuente: habr.com

Añadir un comentario