【问题标题】:Reduce output must shrink more rapidly -- Reducing to a list of documents减少输出必须更快地减少——减少到文档列表
【发布时间】:2016-09-17 07:35:02
【问题描述】:

我的沙发数据库中有一些带有 json 的文档,如下所示。每个 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);
}

这里是减少示例:

function(key, values, rereduce){

var kv = [];

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

return kv;
}

如果有两个文档,并且 reduce 输出的列表包含 1 个文档,则可以正常工作。但是,如果我再添加一个文档(cId = 2),则会引发错误-“减少输出必须更快地缩小”。为什么会这样?我怎样才能实现我的目标?

【问题讨论】:

    标签: couchdb couchdb-futon


    【解决方案1】:

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

    B-tree 存储的工作方式意味着,如果您实际上没有 在 reduce 函数中减少你的数据,你最终会拥有 CouchDB 复制大量数据线性增长,如果不是更快的话 与您的视图中的行数。

    CouchDB 将能够计算最终结果,但仅限于视图 有几行。任何更大的东西都会经历一个可笑的慢 查看构建时间。为了帮助解决这个问题,自 0.10.0 版以来的 CouchDB 将 如果您的 reduce 函数不减少其输入,则抛出错误 价值观。

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

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

    列表 URL 遵循以下模式:

    /db/_design/foo/_list/list-name/view-name

    与视图一样,列表在设计文档中定义:

    {
      "_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
    }
    

    【讨论】:

    • 你是对的。我正在尝试根据某些条件过滤列表。问题是该标准也存在于数据库中的一个文档中。所以,我也需要在同一个组中,这样我才能应用逻辑。地图将单独处理所有文档。
    • 谢谢。会试试的。
    • 我们如何定义列表?在蒲团中,您只能定义临时视图。
    • 视图、列表等在设计文档中定义,见docs.couchdb.org/en/stable/api/ddoc。上面的示例显示了一个 id 为“_design/foo”的设计文档。当您在蒲团中保存临时视图时,它会将其添加到设计文档中。
    • 我想我们需要编辑 json 本身。没有适当的方法可以将列表添加到设计文档中。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 2019-04-18
    • 1970-01-01
    • 2012-12-21
    相关资源
    最近更新 更多