14 cousas que me gustaría saber antes de comezar con MongoDB

A tradución do artigo preparouse na véspera do comezo do curso "Bases de datos non relacionais".

14 cousas que me gustaría saber antes de comezar con MongoDB

Puntos destacados:

  • É moi importante desenvolver un esquema aínda que sexa opcional en MongoDB.
  • Así mesmo, os índices deben coincidir co teu esquema e patróns de acceso.
  • Evite usar obxectos grandes e matrices grandes.
  • Teña coidado coa configuración de MongoDB, especialmente cando se trata de seguridade e fiabilidade.
  • MongoDB non ten un optimizador de consultas, polo que debes ter coidado ao realizar operacións de consulta.

Estiven traballando con bases de datos durante moito tempo, pero só recentemente descubrín MongoDB. Hai algunhas cousas que me gustaría saber antes de comezar a traballar con el. Cando unha persoa xa ten experiencia nun campo determinado, ten nocións preconcibidas sobre o que son as bases de datos e o que fan. Coa esperanza de facilitar a comprensión dos demais, presento unha lista de erros comúns.

Creando un servidor MongoDB sen autenticación

Desafortunadamente, MongoDB instálase sen autenticación por defecto. Para unha estación de traballo á que se accede localmente, esta práctica é normal. Pero dado que MongoDB é un sistema multiusuario ao que lle gusta empregar grandes cantidades de memoria, será mellor que o poñas nun servidor coa maior memoria RAM posible, aínda que só o vas utilizar para o desenvolvemento. A instalación no servidor a través do porto predeterminado pode ser problemática, especialmente se se pode executar algún código javascript na solicitude (por exemplo, $where como idea para inxeccións).

Hai varios métodos de autenticación, pero o máis sinxelo é establecer un ID de usuario/contrasinal. Use esta idea mentres pensa na autenticación de fantasía baseada en LDAP. Cando se trata de seguridade, MongoDB debería actualizarse constantemente e os rexistros sempre deberían comprobarse se hai accesos non autorizados. Por exemplo, gústame seleccionar un porto diferente como porto predeterminado.

Non esquezas vincular a superficie de ataque a MongoDB

Lista de verificación de seguranza de MongoDB contén bos consellos para reducir o risco de intrusión na rede e fuga de datos. É doado descartalo e dicir que un servidor de desenvolvemento non necesita un alto nivel de seguridade. Non obstante, non é tan sinxelo e isto aplícase a todos os servidores MongoDB. En particular, se non hai ningunha razón convincente para usar mapReduce, group ou $onde, cómpre desactivar o uso de código arbitrario en JavaScript escribindo no ficheiro de configuración javascriptEnabled:false. Dado que os ficheiros de datos non están cifrados en MongoDB estándar, ten sentido executar MongoDB Usuario dedicado, que ten acceso total aos ficheiros, con acceso limitado só a el e a posibilidade de utilizar os controis de acceso aos ficheiros do propio sistema operativo.

Erro ao desenvolver o circuíto

MongoDB non usa un esquema. Pero isto non significa que o esquema non sexa necesario. Se só queres almacenar documentos sen ningún patrón consistente, almacenalos pode ser rápido e sinxelo, pero recuperalos máis tarde pode ser difícil. maldito duro.

Artigo clásico "6 regras básicas para o deseño de esquemas MongoDB Paga a pena ler, e características como Explorador de esquemas na ferramenta de terceiros Studio 3T, paga a pena usar para verificacións regulares de circuítos.

Non esquezas a orde de clasificación

Esquecer a orde de clasificación pode causar máis frustración e perder máis tempo que calquera outra configuración incorrecta. Por defecto MongoBD usa clasificación binaria. Pero é pouco probable que sexa útil para ninguén. Os tipos binarios sensibles a maiúsculas e minúsculas, sensibles ao acento eran considerados anacronismos curiosos xunto con abelorios, caftáns e bigotes rizados nos anos 80 do século pasado. Agora o seu uso é imperdoable. Na vida real, "moto" é o mesmo que "moto". E "Gran Bretaña" e "Gran Bretaña" son o mesmo lugar. Unha letra minúscula é simplemente o equivalente en maiúscula dunha letra maiúscula. E non me empece a clasificar diacríticos. Ao crear unha base de datos en MongoDB, use a intercalación sen acento e rexistrarse, que corresponden á lingua e cultura do usuario do sistema. Isto facilitará moito a busca a través de datos de cadea.

Crea coleccións con documentos grandes

MongoDB ten o pracer de aloxar documentos grandes de ata 16 MB en coleccións e GridFS Deseñado para documentos grandes de máis de 16 MB. Pero só porque alí se poden colocar documentos grandes, almacenalos alí non é unha boa idea. MongoDB funcionará mellor se almacena documentos individuais duns poucos kilobytes de tamaño, tratándoos máis como filas nunha táboa SQL ampla. Os documentos grandes serán unha fonte de problemas produtividade.

Creación de documentos con grandes matrices

Os documentos poden conter matrices. É mellor se o número de elementos da matriz está lonxe dun número de catro díxitos. Se se engaden elementos a unha matriz con frecuencia, superará o documento que o contén e terá que ser mover, o que significa que será necesario actualizar índices tamén. Ao volver a indexar un documento cunha matriz grande, os índices adoitan sobrescribirse, xa que hai un rexistro, que almacena o seu índice. Esta reindexación tamén ocorre cando se insire ou elimina un documento.

MongoDB ten algo chamado "factor de recheo", que ofrece espazo para que os documentos crezan para minimizar este problema.
Podes pensar que podes prescindir da indexación de matrices. Desafortunadamente, a falta de índices pode provocar que teñas outros problemas. Dado que os documentos son escaneados de principio a fin, a busca de elementos ao final da matriz levará máis tempo e a maioría das operacións asociadas con tal documento serán lento.

Non esquezas que a orde das etapas nunha agregación importa

Nun sistema de base de datos cun optimizador de consultas, as consultas que escribe son explicacións do que quere obter, non como obtelo. Este mecanismo funciona por analoxía co pedido nun restaurante: normalmente simplemente encargas un prato e non dás instrucións detalladas ao cociñeiro.

En MongoDB, instrúes ao cociñeiro. Por exemplo, cómpre asegurarse de que os datos pasan reduce o máis cedo posible na canalización utilizando $match и $project, e a clasificación ocorre só despois reduce, e que a busca ocorre exactamente na orde que desexa. Ter un optimizador de consultas que elimina o traballo innecesario, secuencia os pasos de forma óptima e selecciona tipos de unión pode estragarche. Con MongoDB, tes máis control a costa da comodidade.

Ferramentas como Estudio 3T simplificará a construción de consultas de agregación en MongoDB. A función Editor de agregación permítelle aplicar instrucións de pipeline unha etapa á vez e inspeccionar os datos de entrada e saída en cada etapa para facilitar a depuración.

Usando a gravación rápida

Nunca configure as opcións de escritura de MongoDB para que teñan alta velocidade pero baixa fiabilidade. Este modo "arquivar e esquecer" parece rápido porque o comando devólvese antes de que se produza a escritura. Se o sistema falla antes de escribir os datos no disco, perderanse e acabarán nun estado inconsistente. Afortunadamente, MongoDB de 64 bits ten habilitado o rexistro.

Os motores de almacenamento MMAPv1 e WiredTiger usan o rexistro para evitalo, aínda que WiredTiger pode recuperar a última versión consistente. punto de control, se o rexistro está desactivado.

O rexistro en diario garante que a base de datos estea nun estado coherente despois da recuperación e conserva todos os datos ata que se escriba no diario. A frecuencia das gravacións configúrase mediante o parámetro commitIntervalMs.

Para estar seguro das entradas, asegúrate de que o rexistro estea activado no ficheiro de configuración (storage.journal.enabled), e a frecuencia das gravacións correspóndese coa cantidade de información que pode permitirse perder.

Ordenación sen índice

Ao buscar e agregar, moitas veces hai que ordenar os datos. Esperemos que isto se faga nunha das fases finais, despois de filtrar o resultado para reducir a cantidade de datos que se están ordenando. E mesmo neste caso, necesitarás para clasificar índice. Podes usar un índice único ou composto.

Se non hai un índice axeitado, MongoDB prescindirá del. Hai un límite de memoria de 32 MB no tamaño total de todos os documentos operacións de clasificación, e se MongoDB chega a este límite, lanzará un erro ou devolverá conxunto de rexistros baleiro.

Busca sen compatibilidade con índices

As consultas de busca realizan unha función similar á operación JOIN en SQL. Para funcionar mellor, necesitan o índice do valor da clave utilizada como chave estranxeira. Isto non é obvio porque o uso non se reflicte explain(). Estes índices súmanse ao índice escrito explain(), que á súa vez é utilizado polos operadores de gasodutos $match и $sort, cando se atopan ao comezo do gasoduto. Agora os índices poden cubrir calquera etapa canalización de agregación.

Desactivar o uso de actualizacións múltiples

Método db.collection.update() úsase para cambiar parte dun documento existente ou o documento completo, ata unha substitución completa, dependendo do parámetro que especifique update. O que non é tan obvio é que non procesará todos os documentos da colección a menos que configures a opción multi actualizar todos os documentos que cumpran os criterios de solicitude.

Non esquezas a importancia da orde das claves nunha táboa hash

En JSON, un obxecto consiste nunha colección non ordenada de tamaño cero ou máis pares nome/valor, onde o nome é unha cadea e o valor é unha cadea, número, booleano, nulo, obxecto ou matriz.

Desafortunadamente, BSON fai moita énfase na orde cando busca. En MongoDB, a orde das claves dentro dos obxectos integrados asuntos, é dicir { firstname: "Phil", surname: "factor" } - isto non é o mesmo que { { surname: "factor", firstname: "Phil" }. É dicir, debes almacenar a orde dos pares nome/valor nos teus documentos se queres estar seguro de atopalos.

Non te confundas "Nulo" и "indefinido"

Valor "indefinido" nunca foi válido en JSON, segundo norma oficial JSON (ECMA-404 Sección 5), aínda que se usa en JavaScript. Ademais, para BSON está obsoleto e convértese en $null, que non sempre é unha boa solución. Evita usar "indefinido" en MongoDB.

Usar $limit() sen $sort()

Moitas veces, cando está a desenvolver en MongoDB, é útil só ver unha mostra do resultado que se devolverá dunha consulta ou agregación. Para esta tarefa necesitarás $limit(), pero nunca debería estar no código final a menos que o uses antes $sort. Esta mecánica é necesaria porque, se non, non pode garantir a orde do resultado e non poderá ver os datos de forma fiable. Na parte superior do resultado obterás diferentes entradas dependendo da clasificación. Para funcionar de forma fiable, as consultas e agregacións deben ser deterministas, é dicir, producir os mesmos resultados cada vez que se executan. Código que contén $limit(), pero non $sort, non será determinista e posteriormente pode causar erros que serán difíciles de rastrexar.

Conclusión

O único xeito de decepcionarse con MongoDB é comparalo directamente con outro tipo de base de datos, como un DBMS, ou chegar a utilizalo en función de determinadas expectativas. É como comparar unha laranxa cun garfo. Os sistemas de bases de datos serven para fins específicos. É mellor entender e apreciar estas diferenzas por si mesmo. Sería unha vergoña presionar aos desenvolvedores de MongoDB por un camiño que os obrigou a seguir o camiño do DBMS. Quero ver formas novas e interesantes de resolver problemas antigos, como garantir a integridade dos datos e crear sistemas de datos resistentes a fallos e ataques maliciosos.

A introdución de MongoDB da transaccionalidade ACID na versión 4.0 é un bo exemplo de introducir importantes melloras de forma innovadora. As transaccións con varios documentos e con varios extractos agora son atómicas. Tamén é posible axustar o tempo necesario para adquirir bloqueos e finalizar transaccións atascadas, así como cambiar o nivel de illamento.

14 cousas que me gustaría saber antes de comezar con MongoDB

Le máis:

Fonte: www.habr.com

Engadir un comentario