2011-01-07 17 views
8

我们有一个XML数据库的CouchDB表示,我们用它来为基于JavaScript的前端操作XML文档。基本结构是一个简单的3级层次结构。即如何在couchDB视图中引用其他文档(加入类似功能)

A - >乙 - “ç

答:父文档(A型) B:任意数量的父的子文档的A型 C:任意数量的父类型B的子文档的

我们在CouchDB中使用type属性表示这3种文档类型:

eg

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

我想要做的是产生它返回文档就像A型,但包括从B文档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... 
     } 
    } 
} 
} 

我正在努力让自己的头脑最好的方式来执行此操作。它看起来应该相当简单!

回答

7

已经在看“链接的文档”部分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']}); 
     } 
    } 
} 

(未经测试)

然后用include_docs=true

+1

查询此发出的每个问题,在一个单独的结果虽然不是吗我希望建立一个单一的文件发出 – Surfrdan

+1

你也可以'发射(doc._id,{_ id:doc.logicalMap.issues [i] ['FILE']});'然后将结果合并到'减少“功能,但是,您应该尽量减少结果尽可能以数字表示,所以我宁愿将该代码移到客户端。 –

+2

而不是将结果合并到reduce函数中,您可以尝试改为使用list函数。 –

相关问题