Estruturas de árvore modelo com caminhos materializados
Nesta página
Visão geral
Esta página descreve um modelo de dados que descreve uma estrutura semelhante à árvore em documentos MongoDB armazenando caminhos completos de relacionamento entre documentos.
Padrão
O padrão Caminhos Materializados armazena cada nó de árvore em um documento; Além do nó de árvore, o documento armazena como uma string o(s) ID(s) dos ancestrais ou caminho do nó. Embora o padrão Caminhos Materializados exija etapas adicionais de trabalho com strings e expressões regulares, o padrão também fornece mais flexibilidade no trabalho com o caminho, como localizar nós por caminhos parciais.
Considerar a seguinte hierarquia de categorias:
O exemplo seguinte modela a árvore utilizando Caminhos Materializados, armazenando o caminho no campo path
; a string de caminho utiliza a vírgula ,
como um delimitador:
db.categories.insertMany( [ { _id: "Books", path: null }, { _id: "Programming", path: ",Books," }, { _id: "Databases", path: ",Books,Programming," }, { _id: "Languages", path: ",Books,Programming," }, { _id: "MongoDB", path: ",Books,Programming,Databases," }, { _id: "dbm", path: ",Books,Programming,Databases," } ] )
Você pode executar query para recuperar toda a árvore, classificando pelo campo
path
:db.categories.find().sort( { path: 1 } ) Você pode utilizar expressões regulares no campo
path
para localizar os descendentes deProgramming
:db.categories.find( { path: /,Programming,/ } ) Você também pode recuperar os descendentes de
Books
onde oBooks
também está no nível superior da hierarquia:db.categories.find( { path: /^,Books,/ } ) Para criar um índice no campo
path
utilize a seguinte invocação:db.categories.createIndex( { path: 1 } ) Esse índice pode melhorar o desempenho dependendo da query:
Para queries da subárvore raiz
Books
(por exemplo,/^,Books,/
ou/^,Books,Programming,/
), um índice no campopath
melhora significativamente o desempenho da query.Para queries de subárvores em que o caminho da raiz não é fornecido na query (por exemplo,
/,Databases,/
), ou queries semelhantes de subárvores, onde o nó pode estar no meio da string indexada, a query deve inspecionar todo o índice.Para essas queries, um index pode fornecer alguma melhoria de desempenho se o index for significativamente menor do que a coleção inteira.