示例博客方案。
有三个实体:帖子,评论和作者(评论) 我希望收到一份格式的评论列表:Comment.Header Post.Header Author.Name
标识 头 文本 ...
标识 名称 ...
标识 头 文本 帖子ID AUTHORID
使用SQL连接是微不足道的,但我不知道如何在CouchDb中执行此操作,而不会根据评论对数据库提出额外的请求,这根本不可行。
答案 0 :(得分:2)
我们假设你有这些实体:
发布
{
"_id": "bbd998617a479940eb536cc842000630",
"_rev": "1-1145fee61f02ebb32d12f03c95f5597d",
"Header": "Example Header",
"type": "post"
}
作者
{
"_id": "bbd998617a479940eb536cc842002322",
"_rev": "1-aab8fd1832046602fed1cad425a98c0f",
"name": "Example Author",
"type": "author"
}
注释
{
"_id": "bbd998617a479940eb536cc84200280c",
"_rev": "2-f311bd9ab26867f924a837b0c0f76954",
"type": "comment",
"post": "bbd998617a479940eb536cc842000630",
"author": "bbd998617a479940eb536cc842002322",
"text": "Comment Text Blah Blah Blah"
}
您可以使用此设计文档构建一个生成所需结果的索引:
{
"_id": "_design/query",
"_rev": "9-f441a082e47b2cb51c72d001d9b411e3",
"views": {
"query": {
"map": function(doc) {
if (doc.type && doc.type=="comment") {
emit([doc._id],{ "_id":doc._id});
emit([doc._id, "author"],{ "_id":doc.author});
emit([doc._id, "post"],{ "_id":doc.post});
}
}
}
}, "lists" : {
"listname":function(head,req){FUNCTION_BODY}
}
"language": "javascript"
}
第一个发出将返回注释文档,第二个发出,第三个发出将分别返回作者和帖子。
然后,您可以使用reduce函数将查询结果简化为必填字段,最后根据需要使用_list函数格式化结果。
获取JSON输出的示例_list:
function (head, req) {
var row;
var i=0;
var comments=[];
while(row = getRow()){
var comment_index=Math.floor(i/3);
if(i%3==0){
comments[comment_index] = {};
comments[comment_index]["comment_text"]= row.doc.text;
}
else if(i%3==1){
comments[comment_index]["author_name"]= row.doc.name;
}
else if(i%3==2){
comments[comment_index]["post_header"]= row.doc.Header;
}
i++;
}
send(JSON.stringify(comments));
}
然后通过(您必须包含include_docs)调用您的视图:http://HOST/DATABASE/_design/DESIGN/_list/LIST/VIEW?include_docs=true