3

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

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

// Reply
{
    "_id": 2,
    "post_id": 1,
    "type": "reply",
    "text": "",
    "timestamp": 2,
}
  1. 所有回复都是平的(没有回复回复,所有回复都是帖子)
  2. 过去的帖子和回复的流量是无限的

理想情况下,我想在没有任何回复的情况下找到最新的线程。


到目前为止,我有这些 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 必须是组键。

问题:如何找到 N 个最近没有回复的线程,如何按帖子的时间戳对缩减视图进行排序?

更简单的问题:如果有没有回复的线程(布尔解决方案),我该如何找到?这意味着过滤缩减的视图,以便只留下零值行。

4

1 回答 1

1

我认为更简单的实现是为您添加附加字段reply_count
默认为零,
当回复回复时,
reply_count+=1

来搜索零回复的帖子,
地图功能可以很简单:

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

询问 :

descending=true
startkey=[0,9999999999]
endkey=[0,0]
include_docs=true
于 2012-07-24T16:25:54.873 回答