CouchDB中的一个视图,用于查找最近没有回复的论坛线程

CouchDB中的一个视图,用于查找最近没有回复的论坛线程,couchdb,Couchdb,假设我们有一个假设论坛的以下数据模型: // Post { "_id": 1, "type": "post", "text": "", "timestamp": 1, } // Reply { "_id": 2, "post_id": 1, "type": "reply", "text": "", "timestamp": 2, } 所有回复都是平淡的(没有回复回复,所有回复都是对一篇帖子的回复) 过去的帖子和回复源源不

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

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

// Reply
{
    "_id": 2,
    "post_id": 1,
    "type": "reply",
    "text": "",
    "timestamp": 2,
}
  • 所有回复都是平淡的(没有回复回复,所有回复都是对一篇帖子的回复)
  • 过去的帖子和回复源源不断
  • 理想情况下,我希望找到最新的线程,而不需要任何回复。


    到目前为止,我有以下映射/减少功能:

    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。到目前为止,一切顺利

    但是,

  • 假设流理论上是无界的,我不能在应用程序或CouchDB的列表/过滤器函数中对其进行排序或过滤,因为它们适用于返回的(并且已经被截断的)数据集
  • 更改密钥或组级别会破坏我想要的分组,post ID必须是组密钥

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


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

    我认为更容易的实现是添加额外的字段
    回复计数
    默认为零,
    回复时,
    答复(u计数+=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
    

    考虑到您提供的当前数据模型,这听起来像是应用程序逻辑的问题。@OctavianDamiean,正如我所说的,我无法将其推送到应用程序中,因为数据集是无限的。@MattJoiner因为您可以有任意数量的过去的帖子/回复,所以未指定最早的事件是什么。