2012-07-24 25 views
3

比方說,我們有一個假設的論壇下面的數據模型:CouchDB中的視圖找到最近的論壇主題零回覆

// 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); 
} 

如果我跑這和GROUP BY鍵,它給我的所有線程的列表,其中值沒有回覆的人是0 。到現在爲止還挺好。

但是,

  1. 鑑於流在理論上是無限的,我不能排序或在應用程序或CouchDB的列表/過濾功能過濾它,因爲它們適用於返回(並已截斷)數據集;
  2. 更改密鑰或組級別會破壞我想要的分組,帖子ID必須是組密鑰。

問題:我如何找到任何回覆N個最近的線程,我怎麼排序後的時間戳的縮小圖?

更容易的問題:如果有線程沒有回覆(布爾解決方案),我該如何找到?這意味着篩選縮小的視圖,以便只剩下零值的行。

+0

這聽起來像是給出了當前數據模型的應用程序邏輯。 – 2012-07-24 15:18:34

+0

@OctavianDamiean,正如我所說的,我無法將它推到應用程序中,因爲數據集是無界的。 – 2012-07-24 23:05:45

+0

爲什麼這個流是無界的? – 2012-07-25 01:51:31

回答

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 
相關問題