2011-03-30 32 views
1
特定的MapReduce

我有3種類型的文件在我的數據庫:不知道如何創建CouchDB中

{ 
param: "a", 
timestamp: "t" 
} (Type 1) 

{ 
param: "b", 
partof: "a" 
} (Type 2) 

{ 
param: "b", 
timestamp: "x" 
} (Type 3) 

(我不能改變佈局... ;-()

類型1定義了一個開始時間戳,就像開始事件類型1通過類型2文檔連接到幾個類型3文檔

我想獲得最新的類型3(最高時間戳)和相應的類型1

如何組織我的地圖/縮小?

+0

我在考慮數據結構的時候非常困難,能否包含一些更真實的測試數據?我真的很想幫忙,但我真的不太明白要做多好。 – 2011-03-30 14:11:18

回答

0

簡單。對於高度關係數據,請使用關係數據庫。

+0

很好的答案。是不是可以用CouchDB做到這一點? 我知道這不是最優的,但我想學習;-) – philipp 2011-03-31 11:35:44

+0

嗯,今天我有一個更好的一天,所以我會做我最好的CouchDB拍攝在一個單獨的答案。爲了學習的目的,這太棒了!但是,當我說「我無法更改數據結構」時,這是一個紅旗,提醒我考慮架構和SQL數據庫。 – JasonSmith 2011-04-01 04:14:19

0

正如用戶jhs在我之前所說,您的數據是關係型的,如果您無法更改它,那麼您可能需要使用CouchDB重新考慮

通過關係我們的意思是在你的數據中的每一「類型1」或「3型」文檔「知道」只有自己,「2型」的文件保存有關其他類型的文檔之間的關係的認識。使用CouchDB時,只能通過文檔本身的字段進行索引,並且在使用includedocs=true查詢時可以更深入一級。因此,使用單個CouchDB查詢無法實現您請求的內容,因爲某些所需數據與請求的文檔相距兩級。

這裏是兩個查詢解決方案:

{ 
    "views": { 
     "param-by-timestamp": { 
      "map": "function(doc) { if (doc.timestamp) emit(doc.timestamp, [doc.timestamp, doc.param]); }", 
      "reduce": "function(keys, values) { return values.reduce(function(p, c) { return c[0] > p[0] ? c : p }) }" 
     },  
     "partof-by-param": { 
      "map": "function(doc) { if (doc.partof) emit(doc.param, doc.partof); }" 
     }  
    } 
} 

您與param-by-timestamp?reduce=true首先查詢它以獲得最新的時間戳value[0]及其相應PARAM在value[1],然後用partof-by-param?key="<what you got in previous query>"再次查詢。如果您需要連同時間戳和參數一起獲取完整文檔,則您必須使用includedocs=true並提供正確的_doc值。

相關問題