La traducción del artículo se preparó la víspera del inicio del curso.
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
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
No olvides vincular la superficie de ataque a MongoDB.
,
o
. Dado que los archivos de datos no están cifrados en MongoDB estándar, tiene sentido ejecutar MongoDB con
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.
Artículo clásico "
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
Crea colecciones con documentos grandes
MongoDB se complace en alojar documentos grandes de hasta 16 MB en colecciones, y
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.
MongoDB tiene algo llamado
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
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 reduce
y 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
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.
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
.
Para estar seguro de las entradas, asegúrese de que el registro esté habilitado en el archivo de configuración.
, 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
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
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
Optar por no utilizar actualizaciones múltiples
método
Se utiliza para cambiar parte de un documento existente o el documento completo, hasta un reemplazo completo, dependiendo del parámetro que especifique.
. Lo que no es tan obvio es que no procesará todos los documentos de la colección a menos que configure la opción
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 { 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 $null
, lo que no siempre es una buena solución.
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.
Lee mas:
Fuente: habr.com