Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Modelar estructuras de árbol con rutas materializadas

Esta página describe un modelo de datos que representa una estructura tipo árbol en documentos MongoDB al almacenar rutas de relación completas entre documentos.

El patrón materialized paths almacena cada nodo de árbol en un documento; además del nodo del árbol, el documento almacena como string el ID (o IDs) de los antecesores o del camino del nodo. Aunque el patrón Rutas Materializadas requiere pasos adicionales de trabajo con cadenas y expresiones regulares, el patrón también proporciona más flexibilidad al trabajar con la ruta, como encontrar nodos mediante rutas parciales.

Considera la siguiente jerarquía de categorías:

Modelo de datos de árbol para una jerarquía de categorías de muestra.

El siguiente ejemplo modela el árbol utilizando Caminos materializados, almacenando la ruta en el campo path; la cadena de la ruta utiliza la coma , como 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," }
] )
  • Puedes realizar una query para recuperar todo el árbol, ordenando por el campo path:

    db.categories.find().sort( { path: 1 } )
  • Puede utilizar expresiones regulares en el campo path para encontrar los descendientes de Programming:

    db.categories.find( { path: /,Programming,/ } )
  • También puede recuperar los descendientes de Books donde el Books también esté en el nivel superior de la jerarquía:

    db.categories.find( { path: /^,Books,/ } )
  • Para crear un índice en el campo path, use la siguiente invocación:

    db.categories.createIndex( { path: 1 } )

    Este índice puede mejorar el rendimiento dependiendo de la consulta:

    • Para las consultas desde el subárbol raíz Books (por ejemplo, /^,Books,/ o /^,Books,Programming,/), un índice en el campo path mejora significativamente el rendimiento de la query.

    • Para queries de subárboles donde la ruta desde la raíz no se proporciona en la query (por ejemplo, /,Databases,/), o consultas similares de subárboles, donde el nodo puede estar en el medio de la string indexada, la consulta debe inspeccionar todo el índice.

      Para estas queries, un índice puede proporcionar alguna mejora en el rendimiento si el índice es considerablemente más pequeño que toda la colección.

Volver

Arreglo de Ancestros

En esta página