CouchDB:并置视图和键

时间:2014-06-25 04:44:57

标签: view couchdb collocation

在我的沙发上,我有这样的文档对:

{
  _id: "DOCID",
  type: "Task",
  info: { k1: "v1", k2: "v2" }
}
{ 
  _id: "ANOTHER DOCID",
  type: "Final",
  task: "DOCID",
  author: "Authorname"
}

对于作者来说,其中有几对可以存在。

我现在需要一个视图,它会以某种方式为我提供信息,author伴随着info

使用视图搭配我创建了以下视图:

function(doc) {
  if (doc.doc_type == "Final")
    emit([doc.task, 0], doc.author);
  if (doc.doc_type == "Task")
    emit([doc._id, 1], doc.definition);
}

我得到的结果如下:

["153b46415108e95c811e1d4cd018624f", 0] -> "Authorname"
["153b46415108e95c811e1d4cd018624f", 1] -> { info here }

首先,我使用reduce函数将两者合并为一个,但在计时之后,将它们局部分组更快。

但是,现在的方式,我无法通过“Authorname”查询此视图。特别是因为info没有Authorname。

所以我认为有一些解决方案:

  1. 使用reduce功能进行分组和操作键,以便显示作者(我甚至不知道是否可以操作分组键)
  2. 获取所有行,在本地对它们进行分组,并过滤​​我正在寻找的作者(可能是太多不必要的开销)
  3. 拥有多个观看次数并执行2次查询。一个获取DOCID然后查询DOCID。
  4. 巧妙地查询并置视图:以有效的方式将Authorname包含在密钥和查询类型中,但我也认为这不可能,因为Authorname的查询将排除实际的{{1} }。
  5. 那么你会建议怎么做呢? 是的,有理由说明为什么信息是分开的(多个info文档可以与同一个Final文档相关,因此具有相同的信息)

    最佳

    修改 提供的解决方案确实回答了我的问题,但是我继续使用我的视图并将结果分组到我的代码(一个Django View)中,结果非常快!

1 个答案:

答案 0 :(得分:0)

  

我现在需要一个视图,它会以某种方式为我提供信息,作者会附上信息。

因此,如果我理解正确的要求

  1. 视图应由作者姓名查询。

  2. 输出结果应该是作者的名称和INFO文档。

  3. 您的文档结构完美,可以支持linked document retrieval

    我认为这个地图功能应该这样做

    function(doc) {
    
    if(doc.author){
      emit(doc.author,{_id:doc.task});
    
    }
    

    如果我使用include_docs=true查询,这是我得到的结果

     {
      total_rows: 1,
      offset: 0,
      rows: [
        {
          id: "19ae88d060834dafdea9417384e2db20",
          key: "Authorname",
          value: { _id: "DOCID" },
          doc: {
            _id: "DOCID",
            _rev: "1-d7fe42dd7858238bb2d1112abf24f046",
            type: "Task",
            info: { k1: "v1", k2: "v2" }
          }
        }
      ]
    }
    

    关于couchdb wiki

    的减少
      

    reduce函数必须将输入值减小到较小的输出值。如果要在reduce中构建复合返回结构,或仅转换值字段,而不是对其进行汇总,则可能会滥用此功能

    根据评论进行编辑: -

    由于任务文档太大而您不想全部获取它,您可以采取两种方法

    1. 将信息直接嵌入作者中。因为你想从任务中得到的只是信息部分。 Couchdb和其他没有sql数据库鼓励数据的非规范化以便于访问。

    2. 使用list function将大型json输出修改为可供您使用的格式。