2014-09-29 67 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数据模型的关键。

我会重新设计你的数据模型。