Menu Docs
Página inicial do Docs
/
MongoDB Ops Manager
/ /

Evite arrays ilimitadas

Nesta página

  • Visão geral
  • Exemplo
  • Saiba mais

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.

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.

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.

Para saber como incorporar o modelo de dados flexível em seu esquema, consulte as seguintes apresentações em MongoDB.live 2020:

Voltar

Reduzir operações $lookup