Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

Estruturas de árvore modelo com uma array de ancestrais

Nesta página

  • Visão geral
  • Padrão

Esta página descreve um modelo de dados que descreve uma estrutura semelhante a árvore em documentos do MongoDB usando referências a nós pai e uma array que armazena todos os ancestrais.

O padrão Array de Ancestrais armazena cada nó de árvore em um documento. Além do nó de árvore, o documento armazena em uma array o(s) ID(s) dos ancestrais ou caminho do nó.

Considerar a seguinte hierarquia de categorias:

Modelo de dados em árvore para uma hierarquia de amostra de categorias.

O exemplo seguinte modela a árvore utilizando Array of Ancestors. Além do campo ancestors, esses documentos também armazenam a referência à categoria pai imediata no campo parent:

db.categories.insertMany( [
{ _id: "MongoDB", ancestors: [ "Books", "Programming", "Databases" ], parent: "Databases" },
{ _id: "dbm", ancestors: [ "Books", "Programming", "Databases" ], parent: "Databases" },
{ _id: "Databases", ancestors: [ "Books", "Programming" ], parent: "Programming" },
{ _id: "Languages", ancestors: [ "Books", "Programming" ], parent: "Programming" },
{ _id: "Programming", ancestors: [ "Books" ], parent: "Books" },
{ _id: "Books", ancestors: [ ], parent: null }
] )
  • A query para recuperar os ancestrais ou caminho de um nó é rápida e direta:

    db.categories.findOne( { _id: "MongoDB" } ).ancestors
  • Você pode criar um índice no campo ancestors para habilitar a pesquisa rápida pelos nós ancestrais:

    db.categories.createIndex( { ancestors: 1 } )
  • Você pode executar queries pelo campo ancestors para encontrar todos os seus descendentes:

    db.categories.find( { ancestors: "Programming" } )

O padrão Array of Ancestors fornece uma solução rápida e eficiente para encontrar os descendentes e os ancestrais de um nó, criando um índice sobre os elementos do campo de ancestrais. Isso faz da Array of Ancestors uma boa opção para trabalhar com subrees.

O padrão Array of Ancestors é um pouco mais lento do que o padrão Materialized Paths, mas é mais simples de usar.

Voltar

Referências secundárias

Nesta página