2014-04-29 82 views
2

我存儲在Couchbase文件事件數據是這樣來算總:Couchbase的Map/Reduce通過文檔類型

{ 
    user: { 
    id: '0BE2DA2B-9C8F-432D-88C2-B2C1D8D0E4B4', 
    device: { 'manufacturer': 'Apple', 'os': 'iOS', 'name': 'iPhone', 'version': '5S' } 
    }, 
    event_type: 'INTERACTION_A', 
    country: 'GB', 
    timestamp: 1398781631233 
} 

我創建的Map/Reduce查詢,告訴我有多少事件iPhone用戶已經提交。但是,是否可以使用Map/Reduce來查詢操作系統提供事件的獨特設備數量?

每個單獨的設備可能已經提交了1000個事件,但結果會顯示系統已經看到了多少個獨特設備(按操作系統劃分)。我試圖最終得到的數據看起來像這樣:

{ 'iOS': 2343, 'Android': 6343 } 

是否有可能在單個Couchbase視圖中執行此操作?

回答

3

是的,這是可能的。您只需在您的查詢中使用group=true&group_level=1

創建這樣一個觀點:

map : function(){ 
    emit(doc.os, null); 
} 

reduce: _count 

然後加入group=true&group_level=1到查詢:

http://127.0.0.1:8092/default/_design/dev_<designDocName>/_view/<viewName>?connection_timeout=60000&limit=10&skip=0&group=true&group_level=1

還要檢查這個鏈接,瞭解更多的例子:

Writing a simple group by with map-reduce (Couchbase)

http://hardlifeofapo.com/basic-couchbase-querying-for-sql-people/

http://blog.couchbase.com/understanding-grouplevel-view-queries-compound-keys

+0

我不認爲這是我想要的。我的理解(從我可以看到的在我的數據集上運行)是,它會告訴我,我們已經看到了每個操作系統有多少事件。我試圖找到的是分立設備的數量由操作系統 – edlea

+0

@edlea如果您將設備添加到鍵 - 'emit([doc.user.device.os,doc.user.id],null)' - 並通過'group = true'調用視圖,您將獲得每個操作系統唯一的設備。然後你就可以在「列表」中對它們進行計數。 –

0

我覺得我原來的問題可能是過於空泛。不過,我已經達到了這個解決方案:

map: function (doc, meta) { 
     emit([doc.user.device.os, doc.user.id], null); 
    } 

reduce: function (keys, values, rereduce) { 
      var os = {}; 
      keys.forEach(function (k) { os[k] = 1; }); 
      return Object.keys(os).length; 
     } 

運行這一觀點與組=真& group_level = 1給我我想要的東西。

我不確定它會縮放,還是需要考慮rereduce,但它適用於我的測試數據集。