统计CouchDB中的相关文档

统计CouchDB中的相关文档,couchdb,Couchdb,我对CouchDB还很陌生,在MapReduce查询数据的整个过程中,我仍然有一些问题 为了继续使用传统的“博客”示例,假设我有两种类型的文档:post和comment。。。每个评论文档都有一个post\u id字段 有没有一种方法可以让我只需要一个查询就可以得到一个帖子列表,上面有每个帖子的评论数?假设我想显示一个帖子标题列表,每个帖子的评论数如下: My First Post: 4 comments My Second Post: 6 comments .... function (key

我对CouchDB还很陌生,在MapReduce查询数据的整个过程中,我仍然有一些问题

为了继续使用传统的“博客”示例,假设我有两种类型的文档:
post
comment
。。。每个评论文档都有一个
post\u id
字段

有没有一种方法可以让我只需要一个查询就可以得到一个帖子列表,上面有每个帖子的评论数?假设我想显示一个帖子标题列表,每个帖子的评论数如下:

My First Post: 4 comments
My Second Post: 6 comments
....
function (key, values, rereduce) {
    return sum(values);
}
function(doc) {
    if(doc.type == "post") {
        emit([doc._id, 'title', doc.title], 0);
    }
    if(doc.type == "comment") {
        emit([doc.post_id, 'comments'], 1);
    }
}
我知道我可以做到以下几点:

function(doc) {
    if(doc.type == "comment") {
        emit(doc.post_id, 1);
    }
}
然后像这样减少它:

My First Post: 4 comments
My Second Post: 6 comments
....
function (key, values, rereduce) {
    return sum(values);
}
function(doc) {
    if(doc.type == "post") {
        emit([doc._id, 'title', doc.title], 0);
    }
    if(doc.type == "comment") {
        emit([doc.post_id, 'comments'], 1);
    }
}
这给了我一个每个博客帖子id的列表,以及每个帖子的评论数。但是我需要单独获取博客文章的标题,因为我现在唯一拥有的是它们的id


那么,是否有一种方法可以通过只执行一次查询来检索每个博客文章标题的列表,以及每个文章的评论数?

查看视图排序规则:


我的经验是,在大多数“正常”情况下,最好有一个包含帖子和评论的大文档

当然,我知道如果你有成千上万的评论,这不是一个好主意。这就是为什么我说“大多数正常情况”。不要马上放弃这个选项,因为它“不合适”

你可以得到各种各样的好处,比如能够在地图视图中计算评论数,从数据库中轻松(一次请求)检索整个页面,ACID每篇文章(带评论)等等。此外,你现在不需要考虑视图排序之类的小把戏

如果速度变慢,您可以随时在以后转换数据结构(见鬼,我们以前每天都使用RDBMS)


如果您的用例不是完全不适合这个,我真的建议您尝试一下。它工作得非常好。

您可以这样做:

My First Post: 4 comments
My Second Post: 6 comments
....
function (key, values, rereduce) {
    return sum(values);
}
function(doc) {
    if(doc.type == "post") {
        emit([doc._id, 'title', doc.title], 0);
    }
    if(doc.type == "comment") {
        emit([doc.post_id, 'comments'], 1);
    }
}
然后您将得到一个视图,其中每个帖子都有两行,一行有标题,一行有评论

您可以在客户端上将行合并在一起,也可以使用“列表”功能将couchdb中的这些行组合并在一起:


注意:未测试代码

我认为这里需要考虑的主要缺点是更新速度慢,因为你必须获取大文档,添加注释,然后再发送,然后检查冲突,如果有可能启动。