2011-01-07 4 views
8

Nous avons une représentation CouchDB d'une base de données XML que nous utilisons pour alimenter un frontal basé sur javascript pour manipuler les documents XML. La structure de base est une simple hiérarchie à trois niveaux. à savoirComment faire référence à d'autres documents dans une vue couchDB (joindre une fonctionnalité similaire)

A -> B -> C

A: document parent (type A) B: un certain nombre de documents d'enfant de parent de type A C: un certain nombre de documents enfants de type parent B

Nous représentons ces 3 types de documents dans CouchDB avec un attribut type:

{ 
"_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", 
} 

Ce que je veux faire est de produire une vue qui renvoie des documents comme le type A, mais inclut l'attribut label du document B dans la liste des logicalMap par exemple

{ 
"_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... 
     } 
    } 
} 
} 

Je me bats pour trouver la meilleure façon de procéder. Il semble que ce devrait être assez simple cependant!

Répondre

7

Jetez un oeil au « Document lié » Section dans 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']}); 
     } 
    } 
} 

(non testé)

requête Puis, avec include_docs=true

+1

Ce émet chaque numéro dans un résultat séparé ne pas bien J'espérais créer un document unique pour émettre – Surfrdan

+1

Vous pourriez également 'émettre (doc._id, {_ id: doc.logicalMap.issues [i] ['FILE']})', puis fusionner les résultats dans un ' réduire la fonction, Cependant, vous devriez garder les résultats de réduction comme petit autant que possible en nombre, donc je préfère déplacer ce code vers le côté client. –

+2

Plutôt que de fusionner les résultats dans une fonction de réduction, vous pouvez essayer de créer une fonction de liste à la place. –

Questions connexes