CouchDB中的一个视图,用于查找零回复的最近论坛帖子

时间:2012-07-24 12:28:49

标签: couchdb

假设我们有一个假设论坛的以下数据模型:

// Post
{
    "_id": 1,
    "type": "post",
    "text": "",
    "timestamp": 1,
}

// Reply
{
    "_id": 2,
    "post_id": 1,
    "type": "reply",
    "text": "",
    "timestamp": 2,
}
  1. 所有回复都是持平的(没有回复回复,所有回复都是帖子)
  2. 过去的帖子和回复流是无限的
  3. 理想情况下,我想在没有任何回复的情况下找到最新的主题。


    到目前为止,我有这些map / reduce函数:

    map: function(doc) {
        if (doc.type == "post") {
            emit(doc._id, 0);
        }
        if (doc.type == "reply") {
            emit(doc.post_id, 1);
        }
    },
    reduce: function(keys, vals, rereduce) {
        return sum(vals);
    }
    

    如果我按键运行它并按组分组,它会给我一个所有线程的列表,其中对于未复制的线程,值为0。到目前为止,非常好。

    但是,

    1. 鉴于该流理论上是无限制的,我无法在应用程序或CouchDB的列表/过滤器函数中对其进行排序或过滤,因为它们适用于返回的(并且已截断的)数据集;
    2. 更改密钥或组级别会破坏我想要的分组,帖子ID必须是组密钥。

    3. 问题:如何找到没有回复的N个最新主题,如何按帖子的时间戳排序缩小的视图?

      更简单的问题:如果有没有回复的线程(布尔解决方案),我怎么找到?这意味着过滤缩小视图,因此只剩下零值行。

1 个答案:

答案 0 :(得分:1)

我认为更容易实现的是添加其他字段reply_count
默认为零,
当答复回复时,
REPLY_COUNT + = 1

来搜索零回复的帖子,
map函数可以简单如下:

function (doc) {
  if (doc.type == "post")
  {
    emit([doc.reply_count, doc.timestamp], null);
  }
}

查询:

descending=true
startkey=[0,9999999999]
endkey=[0,0]
include_docs=true