14 coisas que gostaria de saber antes de começar a usar o MongoDB

A tradução do artigo foi preparada às vésperas do início do curso "Bases de dados não relacionais" .










Luzes:



  • É extremamente importante projetar o esquema, embora seja opcional no MongoDB.
  • Da mesma forma, os índices devem corresponder ao seu esquema e padrões de acesso.
  • Evite usar objetos grandes e matrizes grandes.
  • Tenha cuidado com as configurações do MongoDB, especialmente quando se trata de segurança e confiabilidade.
  • O MongoDB não tem um otimizador de consulta, portanto, você deve ter cuidado ao realizar operações de consulta.


Trabalho com bancos de dados há muito tempo, mas só recentemente descobri o MongoDB. Existem algumas coisas que eu gostaria de saber antes de começar a usá-lo. Quando uma pessoa já tem experiência em determinada área, ela tem ideias preconcebidas sobre o que são bancos de dados e o que fazem. Na esperança de tornar mais fácil para os outros entenderem, aqui está uma lista de erros comuns.



Criação do servidor MongoDB sem autenticação



Infelizmente, o MongoDB é instalado sem autenticação por padrão. É normal que uma estação de trabalho seja acessada localmente. Mas, como o MongoDB é um sistema multiusuário que gosta de usar grandes quantidades de memória, é melhor colocá-lo em um servidor com o máximo de RAM possível, mesmo se for usá-lo apenas para desenvolvimento. A instalação no servidor através da porta padrão pode ser problemática, especialmente se qualquer código javascript pode ser executado na solicitação (por exemplo, $wherecomo uma ideia para uma injeção ).



Existem vários métodos de autenticação, mas o mais fácil é definir um ID de usuário / senha. Pegue essa ideia enquanto pensa sobre a autenticação sofisticada baseada em LDAP . Em termos de segurança, o MongoDB deve ser mantido atualizado e os logs devem sempre ser verificados em busca de acesso não autorizado. Por exemplo, gosto de escolher uma porta diferente como a porta padrão.



Lembre-se de vincular a superfície de ataque ao MongoDB



A Lista de verificação de segurança do MongoDB contém boas dicas para reduzir o risco de intrusão na rede e vazamento de dados. É fácil descartar isso e dizer que um servidor de desenvolvimento não precisa de um alto nível de segurança. No entanto, as coisas não são tão simples e isso se aplica a todos os servidores MongoDB. Em particular, a menos que haja um motivo convincente para usar mapReduce, groupou $ where , você deve desabilitar o uso de código JavaScript arbitrário escrevendo no arquivo de configuração javascriptEnabled:false. Como os arquivos de dados não são criptografados no MongoDB padrão, faz sentido executar o MongoDB com um usuário dedicado que tenha acesso total aos arquivos, com acesso limitado apenas a ele e a capacidade de usar os próprios controles de acesso aos arquivos do sistema operacional.



Erro de projeto de circuito



MongoDB não usa esquema. Mas isso não significa que o circuito não seja necessário. Se você deseja apenas armazenar documentos sem um layout consistente, salvar pode ser rápido e fácil, mas recuperá-los mais tarde pode ser muito difícil .



O artigo clássico “ 6 regras básicas para design de esquema MongoDB” vale a pena ler, enquanto recursos como o Schema Explorer na ferramenta de terceiros do Studio 3T valem a pena usar para validação de esquema regular.



Não se esqueça da ordem de classificação



Esquecer a ordem de classificação pode ser o mais frustrante e um desperdício de qualquer outra configuração incorreta. O MongoBD usa classificação binária por padrão . Mas é improvável que seja útil para alguém. Tipos binários sensíveis a maiúsculas e minúsculas, sensíveis ao estresse eram considerados anacronismos curiosos, junto com miçangas, cafetãs e bigodes encaracolados, na década de 1980. Agora, seu uso é imperdoável. Na vida real, "motocicleta" é o mesmo que "motocicleta". E "Grã-Bretanha" e "Grã-Bretanha" são o mesmo lugar. Uma letra minúscula é simplesmente o equivalente em maiúscula de uma letra maiúscula. E não me faça falar sobre classificação diacrítica. Use agrupamento que não diferencia maiúsculas de minúsculas ao criar um banco de dados no MongoDBque correspondem ao idioma e cultura dos usuários do sistema . Isso simplificará muito sua busca por dados de string.



Criação de coleções com documentos grandes



O MongoDB fica feliz em hospedar grandes documentos de até 16 MB em coleções, e o GridFS é projetado para grandes documentos com mais de 16 MB. Mas só porque documentos grandes podem ser colocados lá, não é uma boa ideia mantê-los lá. O MongoDB funciona melhor se você salvar documentos individuais com vários kilobytes de tamanho, tratando-os mais como linhas em uma ampla tabela SQL. Documentos grandes serão uma fonte de problemas de desempenho .



Crie documentos com matrizes grandes



Os documentos podem conter matrizes. É melhor se o número de elementos na matriz estiver longe do número de quatro dígitos. Se os elementos forem adicionados ao array com frequência, ele ultrapassará o tamanho do documento que o contém e precisará ser movido , o que significa que os índices precisarão ser atualizados . Ao reindexar um documento com uma grande matriz, os índices geralmente serão substituídos, pois para cada elemento há uma entrada que armazena seu índice. Essa reindexação também ocorre quando um documento é inserido ou excluído.



O MongoDB tem um chamado "fator de preenchimento" que fornece espaço para os documentos crescerem para minimizar esse problema.

Você pode pensar que pode fazer isso sem indexar as matrizes. Infelizmente, devido à falta de índices, você pode ter outros problemas. Como os documentos são digitalizados do início ao fim, demorará mais para localizar os elementos no final da matriz e a maioria das operações associadas a esse documento serão lentas .



Não se esqueça de que a ordem das etapas na agregação é importante



Em um sistema de banco de dados otimizador de consulta, as consultas que você escreve são explicações sobre o que você deseja obter, não como obter. Esse mecanismo funciona por analogia com o pedido em um restaurante: normalmente você apenas pede um prato e não dá instruções detalhadas ao chef.



No MongoDB, você instrui o cozinheiro. Por exemplo, você precisa ter certeza de que os dados passam o reducemais cedo possível no pipeline usando $matche $project, e a classificação ocorre apenas depois reducee que a pesquisa ocorre exatamente na ordem em que você precisa. Ter um otimizador de consulta que elimina o trabalho desnecessário, organiza de forma otimizada os estágios e seleciona o tipo de conexão pode prejudicá-lo. No MongoDB, você tem mais controle com o custo da conveniência.



Ferramentas comoO Studio 3T facilitará a construção de consultas de agregação no MongoDB . O Editor de agregação permite aplicar instruções de pipeline uma etapa por vez, bem como validar a entrada e a saída em cada etapa para simplificar a depuração.



Usando gravação rápida



Nunca defina os parâmetros de gravação do MongoDB com alta velocidade, mas baixa confiabilidade. Este modo "arquivar e esquecer" parece rápido porque o comando retorna antes que a gravação seja feita. Se o sistema travar antes de os dados serem gravados no disco, eles serão perdidos e em um estado inconsistente. Felizmente, o MongoDB de 64 bits tem o registro ativado.



Os mecanismos de armazenamento MMAPv1 e WiredTiger usam o log para evitar isso, embora o WiredTiger possa se recuperar até o último ponto de verificação correspondente se o log estiver desabilitado.



O registro no diário garante que o banco de dados esteja em um estado consistente após a recuperação e retém todos os dados até que sejam gravados no diário. A frequência de entradas é configurada usando o parâmetro commitIntervalMs.



Para ter certeza dos registros, certifique-se de que o registro esteja habilitado no arquivo de configuração (storage.journal.enabled)e que a frequência dos registros seja apropriada para a quantidade de informações que você pode perder.



Classificação sem índice



Ao pesquisar e agregar, geralmente é necessário classificar os dados. Esperançosamente, isso é feito em uma das etapas finais, após filtrar o resultado a fim de reduzir a quantidade de dados sendo classificados. Mesmo assim, você precisa de um índice para classificar . Você pode usar um índice único ou múltiplo.



Se não houver um índice adequado, o MongoDB fará sem ele. Há um limite de memória de 32 MB para o tamanho total de todos os documentos em uma operação de classificação e, se o MongoDB atingir esse limite, ele gerará um erro ou retornará um conjunto de registros vazio .



Pesquisa sem suporte de índice



As consultas de pesquisa executam uma função semelhante à operação JOIN em SQL. Para obter o melhor desempenho, eles precisam do índice do valor da chave usado como chave estrangeira. Isso não é óbvio, pois o uso não é refletido no explain(). Tais índices são adicionais ao índice escrito explain(), que por sua vez é utilizado pelos operadores do pipeline $matche $sort, quando ocorrem no início do pipeline. Os índices agora podem cobrir qualquer estágio do pipeline de agregação .



Optar por não usar atualização múltipla



O método é db.collection.update()usado para alterar uma parte de um documento existente ou um documento inteiro, até uma substituição completa, dependendo do parâmetro que você especificar update. Não é tão óbvio que ele não processará todos os documentos na coleção até que você defina a opção multide atualizar todos os documentos que atendam aos critérios de consulta.



Não se esqueça da importância da ordem das chaves na tabela de hash



Em JSON, um objeto consiste em uma coleção não ordenada de zero ou mais pares nome / valor, onde nome é uma string e value é uma string, número, booleano, zero, objeto ou array.



Infelizmente, a BSON dá grande importância à ordem durante a pesquisa. No MongoDB, a ordem das chaves nos objetos embutidos é importante , ou seja, { firstname: "Phil", surname: "factor" }Não é o mesmo que { { surname: "factor", firstname: "Phil" }. Ou seja, você deve manter a ordem dos pares nome / valor em seus documentos se quiser ter certeza de encontrá-los.



Não confunda "nulo" e "indefinido"



O valor "undefined" nunca foi válido em JSON de acordo com o padrão JSON oficial (ECMA-404, Seção 5), embora seja usado em JavaScript. Além disso, para BSON ele está obsoleto e foi convertido para $null, o que nem sempre é uma boa solução. Evite usar "undefined" no MongoDB .



Use $limit()sem$sort()



Muitas vezes, quando você está desenvolvendo no MongoDB, é útil ver apenas uma amostra do resultado que retornará de uma consulta ou agregação. É útil para essa tarefa $limit(), mas nunca deve estar na versão final do código, a menos que você o use antes dele $sort. Essa mecânica é necessária porque, de outra forma, você não pode garantir a ordem do resultado e não pode ver os dados de forma confiável. Na parte superior do resultado, você obterá registros diferentes dependendo da classificação. Para funcionar de forma confiável, as consultas e agregações devem ser determinísticas, ou seja, produzir os mesmos resultados cada vez que forem executadas. O código, que está $limit()presente, mas não $sort, não será determinístico e pode, subsequentemente, causar erros que serão difíceis de rastrear.



Conclusão



A única maneira de ficar frustrado com o MongoDB é compará-lo diretamente a outro tipo de banco de dados, como um DBMS, ou ter alguma expectativa específica de usá-lo. É como comparar uma laranja a um garfo. Os sistemas de banco de dados têm objetivos específicos. É melhor simplesmente entender e avaliar essas diferenças por si mesmo. Seria uma pena colocar pressão sobre os desenvolvedores do MongoDB por causa do caminho que os forçou a seguir o caminho do DBMS. Quero ver maneiras novas e interessantes de resolver problemas antigos, como garantir a integridade dos dados e construir sistemas de dados que sejam resilientes a falhas e ataques de usuários mal-intencionados.



A implementação do MongoDB 4.0 da transacionalidade ACID é um bom exemplo de como importantes melhorias estão sendo inovadas. As transações com vários documentos e várias instruções agora são atômicas. Também foi possível ajustar o tempo que leva para adquirir bloqueios e concluir transações travadas, bem como alterar o nível de isolamento.





Consulte Mais informação:






All Articles