Overview
Esta página describe un modelo de datos que describe una estructura similar a un árbol en los documentos MongoDB al almacenar rutas de relación completas entre los documentos.
Patrón
El patrón Rutas Materializadas almacena cada nodo del árbol en un documento; además del nodo del árbol, el documento almacena como cadena los identificadores de los ancestros o la ruta del nodo. Si bien el patrón Rutas Materializadas requiere pasos adicionales para trabajar con cadenas y expresiones regulares, también ofrece mayor flexibilidad al trabajar con la ruta, como la búsqueda de nodos mediante rutas parciales.
Considere la siguiente jerarquía de categorías:
El siguiente ejemplo modela el árbol utilizando rutas materializadas, almacenando la ruta en el campo path; la cadena de 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 consulta para recuperar el árbol completo, ordenándolo 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
pathutilice 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 consulta.Para consultas de subárboles donde no se proporciona la ruta desde la raíz en la consulta (por ejemplo,
/,Databases,/), o consultas similares de subárboles, donde el nodo puede estar en el medio de la cadena 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.