Evite arrays ilimitadas
Nesta página
Visão geral
Um dos benefícios do modelo de esquema avançado do MongoDB é a capacidade de armazenar arrays como valores de campo do documento. O armazenamento de arrays como valores de campo permite modelar relacionamentos um-para-muitos ou muitos-para-muitos em um único documento, em vez de entre collections separadas, como faria em um banco de dados relacional.
No entanto, você deve ter cuidado se estiver adicionando consistentemente elementos a arrays em seus documentos. Se você não limitar o número de elementos em um array, seus documentos podem crescer até um tamanho imprevisível. À medida que o array continua a crescer, a leitura e a criação de índices nesse array têm seu desempenho gradualmente reduzido. Um array grande e crescente pode sobrecarregar os recursos do aplicativo e colocar seus documentos em risco de ultrapassar o limite detamanho do documento BSON .
Em vez disso, considere delimitar suas arrays para melhorar o desempenho e manter seus documentos em um tamanho gerenciável.
Exemplo
Considere o seguinte esquema para uma collection do publishers
:
// publishers collection { "_id": "orielly" "name": "O'Reilly Media", "founded": 1980, "location": "CA", "books": [ { "_id": 123456789, "title": "MongoDB: The Definitive Guide", "author": [ "Kristina Chodorow", "Mike Dirolf" ], "published_date": ISODate("2010-09-24"), "pages": 216, "language": "English" }, { "_id": 234567890, "title": "50 Tips and Tricks for MongoDB Developer", "author": "Kristina Chodorow", "published_date": ISODate("2011-05-06"), "pages": 68, "language": "English" } ] }
Nesse cenário, a matriz books
é ilimitada. Cada novo livro lançado por esta editora adiciona um novo subdocumento à matriz books
. À medida que as editoras continuarem lançando livros, os documentos acabarão ficando muito grandes e causarão uma quantidade desproporcional de sobrecarga de memória no aplicativo.
Para evitar matrizes mutáveis e ilimitadas, separe a coleção publishers
em duas coleções, uma para publishers
e outra para books
. Em vez de incorporar o documento book
inteiro no documento publishers
, inclua uma referência à editora dentro do documento do livro:
// publishers collection { "_id": "oreilly" "name": "O'Reilly Media", "founded": 1980, "location": "CA" }
// books collection { "_id": 123456789, "title": "MongoDB: The Definitive Guide", "author": [ "Kristina Chodorow", "Mike Dirolf" ], "published_date": ISODate("2010-09-24"), "pages": 216, "language": "English", "publisher_id": "oreilly" } { "_id": 234567890, "title": "50 Tips and Tricks for MongoDB Developer", "author": "Kristina Chodorow", "published_date": ISODate("2011-05-06"), "pages": 68, "language": "English", "publisher_id": "oreilly" }
Esse esquema atualizado remove a matriz ilimitada na coleção publishers
e coloca uma referência ao editor em cada documento de livro usando o campo publisher_id
. Isso garante que cada documento tenha um tamanho gerenciável e não haja risco de um campo de documento ficar anormalmente grande.
Referências de documentos podem exigir $lookups
Essa abordagem funciona especialmente bem se o aplicativo carregar as informações do livro e do editor separadamente. Se o aplicativo exigir o livro e as informações juntos, ele precisará executar uma operação $lookup
para unir os dados das coleções publishers
e books
. As operações $lookup
não são muito eficientes; mas, nesse cenário, pode valer a pena a troca para evitar arrays ilimitadas.
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 como modelar relacionamentos com referências de documentos, consulte Modelar relacionamentos de um para muitos com referências de documentos
Para saber como executar query de um array no MongoDB, leia Fazer query de um array.
O MongoDB também oferece um curso gratuito da Universidade MongoDB sobre Modelagem de Dados: Modelagem de Dados para o MongoDB.
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.