减少输出必须更快地缩小 - 减少到文档列表

时间:2016-09-17 07:35:03

标签: couchdb couchdb-futon

我的沙发数据库中有一些文件,如下所示。每个cId都会改变。我创建了一个带map / reduce函数的视图来过滤掉几个文档并返回一个json文档列表。

文件结构 -

{
  "_id": "ccf8a36e55913b7cf5b015d6c50009f7",
  "_rev": "8-586130996ad60ccef54775c51599e73f",
  "cId": 1,
  "Status": true
}

以下是示例地图:

function(doc) {
  if(doc.Key && doc.Value && doc.Status == true)
      emit(null, doc);
}

以下是示例reduce:

function(key, values, rereduce){

var kv = [];

values.forEach(function(value){
   if(value.cId != <some_val>){
       kv.push({"k": value.cId, "v" : value});  
   }
});          

return kv;
}

如果有两个文件并且减少输出包含1个文档的列表,这可以正常工作。但是如果我再添加一个文档(cId = 2),它会抛出错误 - “减少输出必须更快地收缩”。这是为什么造成的?我怎样才能实现我打算做的事情呢?

1 个答案:

答案 0 :(得分:1)

错误的原因是,reduce函数实际上并没有减少任何东西(而是收集对象)。 documentation提到了这一点:

  

B树存储的工作方式意味着如果你实际上没有   减少reduce函数中的数据,最终得到CouchDB   复制大量数据,即使不是更快,也能线性增长   使用视图中的行数。

     

CouchDB将能够计算最终结果,但仅适用于视图   有几行。任何更大的东西都会经历一个非常缓慢的过程   查看构建时间。为了解决这个问题,CouchDB从版本0.10.0开始   如果您的reduce函数没有减少其输入,则抛出错误   值。

我不清楚你打算实现什么目标。 您想要根据特定条件检索文档列表吗?在这种情况下,没有reduce的视图就足够了。

编辑:如果所需结果取决于存储在某个文档中的值,则CouchDB具有名为 list 的功能。它是一个设计函数,如果传递include_docs = true,它可以访问给定视图的所有文档。

列表网址遵循以下模式:

  

/分贝/ _design /富/ _list /列表名称/视图名称

与视图类似,列表在设计文档中定义:

{
  "_id" : "_design/foo",
  "lists" : {
    "bar" : "function(head, req) { 
       var row;
       while (row = getRow()) {
         if (row.doc._id === 'baz') // Do stuff based on a certain doc
       } 
    }"
  },
  ... // views and other design functions
}