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

A tradução do artigo foi preparada na véspera do início do curso "Bancos de dados não relacionais".

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

Destaques:

  • É extremamente importante desenvolver um esquema mesmo que 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 possui 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. Há algumas coisas que eu gostaria de saber antes de começar a trabalhar com isso. Quando uma pessoa já tem experiência em determinada área, ela tem noções pré-concebidas sobre o que são bancos de dados e o que fazem. Na esperança de facilitar a compreensão de outras pessoas, apresento uma lista de erros comuns.

Criando um servidor MongoDB sem autenticação

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

Existem vários métodos de autenticação, mas o mais fácil é definir um ID de usuário/senha. Use esta ideia enquanto pensa em autenticação sofisticada baseada em LDAP. Quando se trata de segurança, o MongoDB deve ser constantemente atualizado e os logs devem sempre ser verificados quanto a acessos não autorizados. Por exemplo, gosto de selecionar uma porta diferente como porta padrão.

Não se esqueça de vincular a superfície de ataque ao MongoDB

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 ignorar e dizer que um servidor de desenvolvimento não precisa de um alto nível de segurança. No entanto, não é tão simples e isso se aplica a todos os servidores MongoDB. Em particular, se não houver razão convincente para usar mapReduce, group ou $ onde, você precisa desabilitar o uso de código arbitrário em JavaScript 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 Usuário Dedicado, que tem acesso total aos arquivos, com acesso limitado apenas a eles e a capacidade de usar os controles de acesso a arquivos do próprio sistema operacional.

Erro ao desenvolver o circuito

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

Artigo clássico "6 regras básicas para design de esquema MongoDB" Vale a pena ler e recursos como Explorador de esquema na ferramenta de terceiros Studio 3T, vale a pena usar para verificações regulares de circuitos.

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

Esquecer a ordem de classificação pode causar mais frustração e desperdiçar mais tempo do que qualquer outra configuração incorreta. Por padrão o MongoBD usa classificação binária. Mas é improvável que seja útil para alguém. Os tipos binários, sensíveis a maiúsculas e minúsculas, eram considerados anacronismos curiosos junto com miçangas, cafetãs e bigodes encaracolados na década de 80 do século passado. Agora seu uso é imperdoável. Na vida real, “moto” é o mesmo que “moto”. E “Grã-Bretanha” e “Grã-Bretanha” são o mesmo lugar. Uma letra minúscula é simplesmente o equivalente maiúsculo de uma letra maiúscula. E não me fale sobre a classificação de diacríticos. Ao criar um banco de dados no MongoDB, use agrupamento sem distinção de acentos e registro, que correspondem ao idioma e cultura do usuário do sistema. Isso tornará a pesquisa em dados de string muito mais fácil.

Crie coleções com documentos grandes

O MongoDB tem o prazer de hospedar documentos grandes de até 16 MB em coleções e GridFS Projetado para documentos grandes com mais de 16 MB. Mas só porque documentos grandes podem ser colocados ali, armazená-los ali não é uma boa ideia. O MongoDB funcionará melhor se você armazenar documentos individuais com alguns kilobytes de tamanho, tratando-os mais como linhas em uma ampla tabela SQL. Documentos grandes serão uma fonte de problemas com produtividade.

Criação de documentos com grandes matrizes

Os documentos podem conter matrizes. É melhor que o número de elementos na matriz esteja longe de ser um número de quatro dígitos. Se elementos forem adicionados frequentemente a um array, ele ultrapassará o tamanho do documento que o contém e precisará ser mover, o que significa que será necessário atualizar índices também. Ao reindexar um documento com uma matriz grande, os índices serão frequentemente sobrescritos, pois há um registro, que armazena seu índice. Essa reindexação também ocorre quando um documento é inserido ou excluído.

MongoDB tem algo chamado "fator de preenchimento", o que oferece espaço para o crescimento dos documentos para minimizar esse problema.
Você pode pensar que pode dispensar a indexação de array. Infelizmente, a falta de índices pode causar outros problemas. Como os documentos são digitalizados do início ao fim, a busca por elementos no final da matriz levará mais tempo e a maioria das operações associadas a esse documento será mais demorada. devagar.

Não esqueça que a ordem dos estágios em uma agregação é importante

Em um sistema de banco de dados com um otimizador de consultas, as consultas que você escreve são explicações sobre o que você deseja obter, não como obtê-lo. Esse mecanismo funciona de forma semelhante ao pedido em um restaurante: normalmente você simplesmente pede um prato e não dá instruções detalhadas ao cozinheiro.

No MongoDB, você instrui o cozinheiro. Por exemplo, você precisa ter certeza de que os dados passam reduce o mais cedo possível no pipeline usando $match и $project, e a classificação ocorre somente após reduce, e que a pesquisa aconteça exatamente na ordem que você deseja. Ter um otimizador de consulta que elimina trabalho desnecessário, sequencia etapas de maneira ideal e seleciona tipos de junção pode estragar você. Com o MongoDB, você tem mais controle ao custo da conveniência.

Ferramentas como Estúdio 3T simplificará a construção de consultas de agregação em MongoDB. O recurso Aggregation Editor permite aplicar instruções de pipeline um estágio por vez e inspecionar os dados de entrada e saída em cada estágio para facilitar a depuração.

Usando Gravação Rápida

Nunca defina as opções de gravação do MongoDB para ter alta velocidade, mas baixa confiabilidade. Este modo "arquivar e esquecer" parece rápido porque o comando é retornado antes da gravação. Se o sistema travar antes que os dados sejam gravados no disco, eles serão perdidos e acabarão em um estado inconsistente. Felizmente, o MongoDB de 64 bits tem o log habilitado.

Os mecanismos de armazenamento MMAPv1 e WiredTiger usam log para evitar isso, embora o WiredTiger possa recuperar até o último armazenamento consistente. ponto de controlo, se o registro em 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 log. A frequência das gravações é configurada através do parâmetro commitIntervalMs.

Para ter certeza das entradas, certifique-se de que o log esteja habilitado no arquivo de configuração (storage.journal.enabled), e a frequência das gravações corresponde à quantidade de informações que você pode perder.

Classificando sem índice

Ao pesquisar e agregar, muitas vezes é necessário classificar os dados. Esperemos que isso seja feito em uma das etapas finais, após filtrar o resultado para reduzir a quantidade de dados que estão sendo ordenados. E mesmo neste caso, para classificar você precisará índice. Você pode usar um índice único ou composto.

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

Pesquisa sem suporte de índice

As consultas de pesquisa executam uma função semelhante à operação JOIN em SQL. Para funcionar melhor, eles precisam do índice do valor da chave usada como chave estrangeira. Isto não é óbvio porque o uso não é refletido em explain(). Esses índices são adicionais ao índice escrito em explain(), que por sua vez é usado por operadores de pipeline $match и $sort, quando eles se encontram no início do pipeline. Os índices agora podem cobrir qualquer estágio pipeline de agregação.

Desativando o uso de atualizações múltiplas

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

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

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

Infelizmente, o BSON dá muita ênfase à ordem durante a pesquisa. No MongoDB, a ordem das chaves nos objetos integrados assuntosIe { firstname: "Phil", surname: "factor" } - isso não é o mesmo que { { surname: "factor", firstname: "Phil" }. Ou seja, você deve armazenar a ordem dos pares nome/valor em seus documentos se quiser ter certeza de encontrá-los.

Não confunda "Nulo" и "indefinido"

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

Usar $limit() sem $sort()

Muitas vezes, quando você está desenvolvendo no MongoDB, é útil ver apenas uma amostra do resultado que será retornado de uma consulta ou agregação. Para esta tarefa você precisará $limit(), mas nunca deve estar no código final, a menos que você o use antes $sort. Essa mecânica é necessária porque, caso contrário, você não poderá garantir a ordem do resultado e não poderá visualizar os dados com segurança. No topo do resultado você obterá entradas 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 sempre que são executadas. Código que contém $limit(), mas não $sort, não será determinístico e poderá subsequentemente causar erros que serão difíceis de rastrear.

Conclusão

A única maneira de ficar desapontado com o MongoDB é compará-lo diretamente com outro tipo de banco de dados, como um SGBD, ou utilizá-lo com base em certas expectativas. É como comparar uma laranja com um garfo. Os sistemas de banco de dados servem a propósitos específicos. É melhor simplesmente compreender e apreciar essas diferenças por si mesmo. Seria uma pena pressionar os desenvolvedores do MongoDB por um caminho que os forçasse a seguir o caminho do DBMS. Quero ver formas novas e interessantes de resolver problemas antigos, como garantir a integridade dos dados e criar sistemas de dados que sejam resilientes a falhas e ataques maliciosos.

A introdução da transacionalidade ACID no MongoDB na versão 4.0 é um bom exemplo de introdução de melhorias importantes de forma inovadora. As transações com vários documentos e múltiplas declarações agora são atômicas. Também é possível ajustar o tempo necessário para adquirir bloqueios e encerrar transações travadas, bem como alterar o nível de isolamento.

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

Consulte Mais informação:

Fonte: habr.com

Adicionar um comentário