2011-01-24 36 views
3

我有一个问题,我有2个类型的文档,其中之一是这样的:CouchDB通过文档域内连接?

{ 
    "type": "PageType", 
    "filename": "demo" 
    "content": "zzz" 
} 

,另外一个是这样的:

{ 
    "type": "PageCommentType", 
    "refFilename": "demo" 
    "content": "some comment content" 
} 

我需要发出一个包含文件。点评字段,它是PageCommentType文档的数组,它是我链接在条件PageType文档的文件名== PageCommentType文档的refFilename字段上的。

{ 
    "filename": "demo", 
    "comments": [{}, {}, {}] 
} 

任何人有任何建议如何实施它?

谢谢。

回答

4

您需要视图整理。相同的视图内发射两者,使用filename作为密钥和类型标识符注释和原始内容之间进行区分:

function(doc) { 
    if (doc.type == "PageType") emit([doc.filename,0],doc.content); 
    if (doc.type == "PageCommentType") emit[doc.refFilename,1],doc.content); 
} 

当寻找文档demo及其评论,与startkey=["demo",0]endkey=["demo",1]运行查询:你会得到页面内容,然后是所有评论。

一旦所有数据你想要的,但它不是在正确的格式,你几乎完成。只需编写一个_list函数来读取所有行并输出包含所需结构/模式的最终JSON文档。

+0

你的意思是第二个'emit'的'doc.comments'? –

+0

这两行结果我管理,但它不是什么即时通讯寻找。我想要聚合的文档有评论属性,这是一个类型为PageCommentType的文档的数组...在CouchDb的早期版本中,我记得有一些方法可以在map函数中调用map并以某种方式包装它,但是我可以'不知道现在它是如何工作的... – Skitsanos

+0

有时候,如果我听到“聚合”,这是从地图/缩减视图**减少**的线索。不幸的是,减少是不会在这里工作的,因为你正在积累数据而不是减少它。 (换句话说,你会得到一个缩小尺寸太大的错误。)我会用一些想法修改Victor的答案。 – JasonSmith