A tradução do artigo foi preparada na véspera do início do curso
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
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
Não se esqueça de vincular a superfície de ataque ao MongoDB
,
ou
. Como os arquivos de dados não são criptografados no MongoDB padrão, faz sentido executar o MongoDB com
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.
Artigo clássico "
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
Crie coleções com documentos grandes
O MongoDB tem o prazer de hospedar documentos grandes de até 16 MB em coleções e
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
MongoDB tem algo chamado
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.
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
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.
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
.
Para ter certeza das entradas, certifique-se de que o log esteja habilitado no arquivo de configuração
, 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á
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
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
Desativando o uso de atualizações múltiplas
método
usado para alterar parte de um documento existente ou todo o documento, até uma substituição completa, dependendo do parâmetro que você especificar
. 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
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 { 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 $null
, o que nem sempre é uma boa solução.
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.
Consulte Mais informação:
Fonte: habr.com