Reduzir o número de collections
Visão geral
Collections são agrupamentos de documentos MongoDB, semelhantes a uma tabela RDBMS . Uma collection existe dentro de um único banco de dados.
Mesmo que uma coleção não contenha nenhum documento, ela ainda vem com um custo de recurso na forma de um índice _id padrão imutável. Embora esse índice não ocupe muito espaço por conta própria (especialmente para coleções pequenas), se você tiver milhares de coleções desses índices podem adicionar recursos e sobrecarregar a alocação do banco de dados.
Se sua implantação contiver um número desnecessário ou crescente de collection, considere reestruturar seus dados para reduzir o número de collection e, por fim, reduzir os requisitos de recursos da sua aplicação.
Exemplo
Considere um banco de dados temperatures
que armazena coleções de leituras de temperatura obtidas de um sensor. O sensor faz leituras a cada meia hora, das 10h às 22h. As leituras de cada dia são armazenadas em uma collection separada, nomeada pela data de leitura:
// temperatures.march-09-2020 { "_id": 1, "timestamp": "2020-03-09T010:00:00Z", "temperature": 29 } { "_id": 2, "timestamp": "2020-03-09T010:30:00Z", "temperature": 30 } ... { "_id": 25, "timestamp": "2020-03-09T022:00:00Z", "temperature": 26 }
// temperatures.march-10-2020 { "_id": 1, "timestamp": "2020-03-10T010:00:00Z", "temperature": 30 } { "_id": 2, "timestamp": "2020-03-10T010:30:00Z", "temperature": 32 } ... { "_id": 25, "timestamp": "2020-03-10T022:00:00Z", "temperature": 28 }
A cada dia que passa, o número de collection no reconhecimento de data center aumenta. Como o número de collection é ilimitado, há uma necessidade cada vez maior do reconhecimento de data center de manter essas collection e seus índices correspondentes. Se o reconhecimento de data center chegar a um ponto em que está gerenciando milhares de collection e índices, isso pode resultar em degradação do desempenho.
Além disso, essa abordagem não facilita facilmente as query em vários dias. Para query dados de vários dias para obter tendências de temperatura em períodos de tempo mais longos, você precisaria executar uma operação $lookup
, que não é tão eficiente quanto query dados na mesma coleção.
Esquema atualizado
Em vez disso, uma abordagem melhor para estruturar esses dados é armazenar todas as leituras de temperatura em uma única collection e ter as leituras de cada dia em um único documento. Considere este esquema atualizado, onde todas as temperaturas estão em uma única collection: temperatures.readings
:
// temperatures.readings { "_id": ISODate("2020-03-09"), "readings": [ { "timestamp": "2020-03-09T010:00:00Z", "temperature": 29 }, { "timestamp": "2020-03-09T010:30:00Z", "temperature": 30 }, ... { "timestamp": "2020-03-09T022:00:00Z", "temperature": 26 } ] } { "_id": ISODate("2020-03-10"), "readings": [ { "timestamp": "2020-03-10T010:00:00Z", "temperature": 30 }, { "timestamp": "2020-03-10T010:30:00Z", "temperature": 32 }, ... { "timestamp": "2020-03-10T022:00:00Z", "temperature": 28 } ] }
Este esquema atualizado requer muito menos recursos do que o esquema original. Agora, em vez de exigir um índice para cada dia em que as temperaturas são lidas, o índice _id
padrão nessa coleção ajuda a facilitar as queries por data.
Como verificar se há coleções desnecessárias
MongoDB Shell (mongosh
)
Para verificar o número de coleções em seu banco de dados, você pode executar o seguinte comando de mongosh
:
db.getCollectionNames().length
O método db.stats() também retorna o número de coleções em seu banco de dados, juntamente com estatísticas úteis do banco de dados, como o tamanho total dos seus dados e índices.
MongoDB Ops Manager
Explorador de dados
O MongoDB Ops Manager Data Explorer fornece uma visão geral de alto nível das collections em seus bancos de dados. O Data Explorer mostra o tamanho total de uma collection, incluindo o tamanho dos índices de uma collection. Se a maior parte do tamanho de uma collection for composta por índices, você pode considerar consolidar os dados dessa collection em outra collection e descartar a collection original. Consulte a documentação $merge
para obter uma abordagem para mesclar dados de uma coleção em outra.
Além disso, se a chave de criptografia de dados (DEK) revelar que você tem collection vazias, você poderá descartar essas collection diretamente da chave de criptografia de dados (DEK).
Painel de desempenho em tempo real
O Ops Manager painel de desempenho em tempo real mostra quais collection recebem mais atividades. Você pode usar essa ferramenta para garantir que, antes de descartar uma collection, ela não esteja sendo usada ativamente pela sua aplicação.
Saiba mais
Para saber mais sobre modelagem de dados no MongoDB e o modelo de esquema flexível, consulte Introdução à modelagem de dados.
Para saber mais sobre bancos de dados e coleções, consulte Bancos de dados e coleções.
Para saber mais sobre como incorporar dados relacionados em um único documento, consulte Modelos de dados incorporados
Apresentações do MongoDB.live 2020
Para saber como incorporar o modelo de dados flexível em seu esquema, consulte as seguintes apresentações em MongoDB.live 2020:
Saiba mais sobre relacionamentos de entidade no MongoDB e exemplos de suas implementações com modelagem de dados com MongoDB.
Aprenda padrões avançados de design de modelagem de dados que você pode incorporar ao seu esquema com os Padrões Avançados de Design de Esquema.