Soy bastante nuevo en couchDB e incluso después de leer "how to store hierarchical data" todavía no hace clic todavía.Recuperando datos jerárquicos/anidados de CouchDB
En lugar de utilizar el patrón de ruta completa como se describe en la wiki, espero seguir a los niños como una matriz de UUID y la principal como un único UUID. Me inclino por este patrón para poder mantener el orden de los niños según sus posiciones en el conjunto de niños.
Aquí hay algunos documentos de muestra en el sofá, los depósitos pueden contener cubos y artículos, los artículos solo pueden contener otros artículos. (UUID abreviados para mayor claridad):
{_id: 3944
name: "top level bucket with two items"
type: "bucket",
parent: null
children: [8989, 4839]
}
{_id: 8989
name: "second level item with no sub items"
type: "item"
parent: 3944
}
{
_id: 4839
name: "second level bucket with one item"
type: "bucket",
parent: 3944
children: [5694]
}
{
_id: 5694
name: "third level item (has one sub item)"
type: "item",
parent: 4839,
children: [5390]
}
{
_id: 5390
name: "fourth level item"
type: "item"
parent: 5694
}
¿Es posible buscar un documento por un identificador de documento incrustado dentro de una función de mapa?
function(doc) {
if(doc.type == "bucket" || doc.type == "item")
emit(doc, null); // still working on my key value output structure
if(doc.children) {
for(var i in doc.children) {
// can i look up a document here using ids from the children array?
doc.children[i]; // psuedo code
emit(); // the retrieved document would be emitted here
}
}
}
}
En un mundo ideal, la salida JSON sería algo así como.
{"_id":3944,
"name":"top level bucket with two items",
"type":"bucket",
"parent":"",
"children":[
{"_id":8989, "name":"second level item with no sub items", "type":"item", "parent":3944},
{"_id": 4839, "name":"second level bucket with one item", "type":"bucket", "parent":3944, "children":[
{"_id":5694", "name":"third level item (has one sub item)", "type":"item", "parent": 4839, "children":[
{"_id":5390, "name":"fourth level item", "type":"item", "parent":5694}
]}
]}
]
}
Gracias por ayudar a Marcello. Cuando ejecuto la función de mapa, la salida no está anidada como esperaba, todo es plano. ¿Algunas ideas? – berg
Mi respuesta es [aquí] (http://stackoverflow.com/questions/6084741/how-to-merge-view-collation-into-useful-output-in-couchdb/6094540#6094540). Sin embargo, no lo recomiendo. ¿Cuál es la ventaja de una lista anidada? La lista plana está ordenada para que cada "elemento" o "cubo" sea seguido inmediatamente por sus hijos en el orden solicitado. Es muy fácil y eficiente atravesar esta lista. ¿Por qué necesita una lista anidada? Puede ser que pueda darte una mejor solución. –
Tenía la esperanza de utilizar los resultados directamente en mi código de JavaScript del lado del cliente, que está esperando que los datos vuelvan anidados. ¡Pero después de leer la pregunta que vinculó parece que esto va contra el grano de CouchDB así que planeo hacer este lado del cliente! ¡Gracias de nuevo, marcaré esto como la respuesta! – berg