【问题标题】:Count related documents in CouchDB统计 CouchDB 中的相关文档
【发布时间】:2011-03-16 12:21:16
【问题描述】:

我对 CouchDB 还是很陌生,但在使用整个 MapReduce 查询数据的方式时,我仍然有一些问题......

继续使用传统的“博客”示例,假设我有两种类型的文档:post 和 comment...每个评论文档都有一个 post_id 字段...

有没有一种方法可以让我获得一个帖子列表,其中包含每个帖子的 cmets 数量,只需 1 个查询?假设我想显示一个帖子标题列表,其中包含每个帖子的 cmets 数量,如下所示:

My First Post: 4 comments
My Second Post: 6 comments
....

我知道我可以做到以下几点:

function(doc) {
    if(doc.type == "comment") {
        emit(doc.post_id, 1);
    }
}

然后像这样减少它:

function (key, values, rereduce) {
    return sum(values);
}

它为我提供了每个博客帖子 ID 的列表,以及每个帖子的 cmets 数量。但是我需要单独获取博客文章的标题,因为我现在唯一拥有的是他们的 id...

那么,有没有一种方法可以通过仅执行 1 次查询来检索每个博客文章标题的列表以及每个文章的 cmets 数量?

【问题讨论】:

    标签: couchdb


    【解决方案1】:
    【解决方案2】:

    你可以这样做:

    function(doc) {
        if(doc.type == "post") {
            emit([doc._id, 'title', doc.title], 0);
        }
        if(doc.type == "comment") {
            emit([doc.post_id, 'comments'], 1);
        }
    }
    

    然后你会得到一个视图,其中每个帖子有两行,一行是标题,另一行是 cmets。

    您可以在客户端将这些行合并在一起,或者您可以使用“列表”函数在 couchdb 中将这些行组合并在一起:

    http://wiki.apache.org/couchdb/Formatting_with_Show_and_List

    function list(head, req) {
      var post;
      var row;
      var outputRow = function() {
         if(post) { send(post); }
      }
      while(row = getRow()) {
        if(!post || row.key[0] != post.id) {
          outputRow();
          post = {id:row.key[0]};
        }
        /* If key is a triple, use part 3 as the value, otherwise assume its a count */
        var value = row.key.length === 3 ? row.key[2] : row.value;
        post[row.key[1]] = value;
      }
      outputRow();
    }
    

    注意:未经测试的代码!

    【讨论】:

      【解决方案3】:

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

      当然,我知道如果您有数千个 cmets,这不是一个好主意。这就是为什么我说“最正常的情况”。不要把这个选项当成“不恰当的”就扔掉。

      您可以获得各种好东西,例如能够在地图视图中计算 cmets 数量、从数据库中轻松(一个请求)检索整个页面、每个帖子的 ACID(使用 cmets)等。另外,您不需要现在需要考虑诸如视图排序之类的技巧。

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

      如果您的用例并非完全不适合这个,我真的建议您尝试一下。效果非常好。

      【讨论】:

      • 我认为这里要考虑的主要缺点是更新速度较慢,因为您必须获取大文档,添加评论并发送回来,然后检查冲突并可能重新开始任何。
      猜你喜欢
      • 2012-03-02
      • 2022-01-23
      • 2017-10-19
      • 2018-07-01
      • 1970-01-01
      • 2019-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多