【问题标题】:CouchDB: Collocated views and keysCouchDB:并置的视图和键
【发布时间】:2014-06-25 17:05:44
【问题描述】:

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

{
  _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 函数将两者合并为一个,但在计时之后,在本地分组它们会更快。

但是,按照现在的方式,我无法通过“作者名”查询此视图。尤其不是因为info 没有作者名。

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

  1. 使用带有分组的reduce函数并操作键以显示作者(我什至不知道是否可以操作分组键)
  2. 获取所有行,在本地对它们进行分组,然后过滤我正在寻找的作者(可能太多不需要的开销)
  3. 拥有多个视图并执行 2 个查询。一种是获取 DOCID,然后查询 DOCID。
  4. 巧妙地查询并置视图:以一种有效的方式将 Authorname 包含到键和查询类型中,但我也不认为这是可能的,因为对 Authorname 的查询将排除实际的 info

那么你会建议继续做这件事吗? 是的,信息分开是有原因的(多个Final 文档可以与同一个Task 文档相关,因此具有相同的信息)

最好的

编辑 提供的解决方案确实回答了我的问题,但我选择使用我的视图并将结果分组到我的代码(Django 视图)中,结果非常快!

【问题讨论】:

    标签: view couchdb collocation


    【解决方案1】:

    我现在需要一个视图,它会给我以某种方式耦合的信息,作者伴随着信息。

    所以如果我理解正确,要求是

    1. 要按作者姓名查询视图。

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

    您的文档结构完美,支持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 中构建复合返回结构,或者仅转换 values 字段而不是对其进行汇总,则您可能误用了此功能

    根据评论编辑:-

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

    1. 直接在作者中嵌入信息。因为你从任务中想要的只是信息部分。 Couchdb 和其他无 sql 数据库鼓励对数据进行非规范化以便于访问。

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

    【讨论】:

    • 感谢您教我这个!您可能会考虑修复您的视图代码。但是,我尽量避免获取整个任务文档,因为它包含很多我不想获取的数据,因为在这种情况下它没有用而且速度很慢。因此,我需要采取更复杂的方法。
    • @user2033511 你能检查一下编辑后的答案是否解决了你的问题。
    • 确实如此,但我现在采用了一种使用视图并手动过滤输出的方法,结果证明速度快了 10 倍(在我的情况下)。所以我会接受你的回答,因为它确实回答了这个问题,但对于我的特殊情况,我找到了解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多