2011-01-07 8 views
8

Tenemos una representación CouchDB de una base de datos XML que usamos para impulsar un front-end basado en JavaScript para manipular los documentos XML. La estructura básica es una jerarquía simple de 3 niveles. es decirCómo hacer referencia a otros documentos en una vista couchDB (uniéndose a la funcionalidad similar)

A -> B -> C

A: documento de nivel superior (tipo A) B: cualquier número de documentos hijos de una matriz de tipo A C: cualquier número de documentos hijos de una matriz de tipo B

Representamos estos 3 tipos de documentos en CouchDB con un atributo type:

por ej.

{ 
"_id":"llgc-id:433", 
"_rev":"1-3760f3e01d7752a7508b047e0d094301", 
"type":"A", 
"label":"Top Level A document", 
"logicalMap":{ 
    "issues":{ 
     "1":{ 
      "URL":"http://hdl.handle.net/10107/434-0", 
      "FILE":"llgc-id:434" 
     }, 
     "2":{ 
      "URL":"http://hdl.handle.net/10107/467-0", 
      "FILE":"llgc-id:467" 
     etc... 
     } 
    } 
} 
} 


{ 
"_id":"llgc-id:433", 
"_rev":"1-3760f3e01d7752a7508b047e0d094301", 
"type":"B", 
"label":"a B document", 
} 

Lo que quiero hacer es producir una vista que devuelve los documentos al igual que el tipo A, sino que incluye el atributo de la etiqueta del documento B dentro de la lista, por ejemplo, logicalMap

{ 
"_id":"llgc-id:433", 
"_rev":"1-3760f3e01d7752a7508b047e0d094301", 
"type":"A", 
"label":"Top Level A document", 
"logicalMap":{ 
    "issues":{ 
     "1":{ 
      "URL":"http://hdl.handle.net/10107/434-0", 
      "FILE":"llgc-id:434", 
      "LABEL":"a B document" 
     }, 
     "2":{ 
      "URL":"http://hdl.handle.net/10107/467-0", 
      "FILE":"llgc-id:467", 
      "LABEL":"another B document" 
     etc... 
     } 
    } 
} 
} 

Estoy luchando para entender la mejor manera de llevarlo a cabo. ¡Parece que debería ser bastante simple!

Respuesta

7

Tener un vistazo a la sección de "documento vinculado' en http://wiki.apache.org/couchdb/Introduction_to_CouchDB_views#Linked_documents

function(doc) { 
    //.... 
    if (doc.logicalMap.issues) { 
     for (var i in doc.logicalMap.issues) { 
      emit([doc._id,doc.logicalMap.issues[i]['FILE']], 
           {_id: doc.logicalMap.issues[i]['FILE']}); 
     } 
    } 
} 

(no probado)

después realizar una consulta con include_docs=true

+1

Este emite cada número en un resultado separado no lo hace, aunque ? Tenía la esperanza de crear un único documento para emitir – Surfrdan

+1

También podría 'emitir (doc._id, {_ id: doc.logicalMap.issues [i] ['FILE']});' y luego fusionar los resultados en un ' reducir la función, sin embargo, debe mantener reducir los resultados tan pequeños como sea posible en números, así que prefiero mover ese código al lado del cliente. –

+2

En lugar de fusionar los resultados en una función de reducción, puede intentar hacer una función de lista en su lugar. –

Cuestiones relacionadas