1

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

{
  _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 视图)中,结果非常快!

4

1 回答 1

0

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

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

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

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

您的文档结构完美,支持链接文档检索

我认为这个地图功能应该做到这一点

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 函数必须将输入值减少为较小的输出值。如果您在 reduce 中构建复合返回结构,或者仅转换 values 字段,而不是对其进行汇总,则您可能误用了此功能

根据评论编辑:-

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

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

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

于 2014-06-25T05:38:08.510 回答