Overview
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.
Patrón
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:
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
pathpara encontrar los descendientes deProgramming:db.categories.find( { path: /,Programming,/ } ) También puede recuperar los descendientes de
Booksdonde elBookstambié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 campopathmejora 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.