2014-09-29 97 views
0

我不確定問題的標題是否合適,如果你知道更好的問題,請告訴我;) 我剛剛這樣命名,因爲我在想如果我能解決我的問題自定義減少功能的問題。Couchbase視圖自定義減少

我有兩種類型的對象:

車輛:

{ 
    "id": "1G1JC5444R7252367", 
    "type": "Vehicle" 
} 

用戶:

{ 
    "company": "companyname", 
    "type": "User", 
    "parts": [ 
    { 
     "company": "companyname", 
     "id": "1G1JC5444R7252367", 
     "active": true 
    }, 
    { 
     "company": "companyname", 
     "id": "1G1135644R7252367", 
     "active": false 
    } 
    ] 
} 

我要的是一個視圖返回我某公司的所有車輛。但該公司只存儲在用戶對象中。

這是我在mapfunction多遠了:

function (doc, meta) { 
    if(doc.type == 'User'){ 
    if(doc.parts){ 

     Array.prototype.contains = function (needle) { 
     for (var i in this) { 
      if (this[i] == needle) return true; 
     } 
     return false; 
     }; 

     var ids = new Array(doc.parts.length); 

     for(var k in doc.parts){ 
     if(doc.parts[k].active) { 
      if(!vins.contains(doc.parts[k].id)) { 
      if (doc.parts[k].company && doc.parts[k].id) { 
       ids.push(doc.parts[k].id); 
       emit(doc.parts[k].company, doc.parts[k].id); 
      } 
      } 
     } 
     } 
    } 
    } 
} 

但這僅返回我公司作爲鑰匙和車輛作爲價值的ID。所以我得到一個用戶文件。我可以以某種方式在map函數中再次循環文檔,並根據我的ID數組中的ID獲取所有車輛?

公司在車上本身也是不希望的,因爲公司不是車輛公司本身,而是零件公司。

感謝您的任何幫助。

回答

0

Couchbase視圖只能對呈現給它的文檔進行操作。正如你發現的那樣,它只能部分地做你想做的事情。

真正的問題不是視圖,而是您的數據模型。您似乎設計了您的數據模型,就好像您在使用關係數據庫一樣。您正在嘗試的計算是一種連接。

文檔數據庫的基本概念是文檔應該代表與某種事件相關的所有信息。這個概念允許文檔數據庫進行橫向擴展。你不應該擔心數據重複。訪問的局部性是適當的map-reduce數據模型的關鍵。

我會重新設計你的數據模型。