1

我不确定问题的标题是否合适,如果您知道更好的标题,请告诉我;)我只是这样命名,因为我在想是否可以使用自定义 reduce 函数解决我的问题。

我有两种类型的对象:

车辆:

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

用户:

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

我想要的是一个视图,它可以返回某个公司的所有车辆。但是公司只存储在 User 对象中。

这是我在 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 函数中以某种方式再次遍历文档并根据我的 ids 数组中的 id 获取所有车辆吗?

将公司保存在车辆本身也是不可取的,因为公司不是车辆公司本身,而是零部件公司。

感谢您提供任何帮助。

4

1 回答 1

1

Couchbase 视图只能对呈现给它的文档进行操作。正如你所发现的,它只能部分做你想做的事。

真正的问题不是视图,而是您的数据模型。您似乎已经像使用关系数据库一样设计了数据模型。您正在尝试的计算是一种联接。

文档数据库的一个基本概念是文档应该代表与某种事件相关的所有信息。这个概念是允许文档数据库水平扩展的原因。您不必担心数据重复。访问的局部性是适当的 map-reduce 数据模型的关键。

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

于 2014-09-30T12:40:15.110 回答