如何在CouchDb文件中处理多个外键?

时间:2017-05-29 16:18:46

标签: couchdb

示例博客方案。

有三个实体:帖子,评论和作者(评论) 我希望收到一份格式的评论列表:Comment.Header Post.Header Author.Name

发布

标识 头 文本 ...

作者

标识 名称 ...

注释

标识 头 文本 帖子ID AUTHORID

使用SQL连接是微不足道的,但我不知道如何在CouchDb中执行此操作,而不会根据评论对数据库提出额外的请求,这根本不可行。

1 个答案:

答案 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