2014-06-25 27 views
1

在我的沙发上我有这样的文件对:CouchDB的:并置的看法和键

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

首先,我使用了减少功能都整合到一个,但时间后它在本地分组速度更快。

但是,现在的方式是,我无法通过“Authorname”查询此视图。尤其不是因为info未附带Authorname。

所以有一些解决方案,这一点,我想:

  1. 使用减少函数分组和操作键,它显示了作者(我不知道,如果操纵分组的关键是可能的)
  2. 获取所有行,将它们分组到本地,并筛选我正在查找的作者(可能过多的不需要的开销)
  3. 有多个视图并执行2个查询。一个获得DOCID,然后查询DOCID。
  4. 巧妙地查询搭配视图:以有效的方式将关键字和类型的查询包括到查询中,但我也不认为这是可能的,因为对Authorname的查询将排除实际的info

那么,你会推荐继续这样做吗? 是的存在是为什么信息是独立的(几个Final文档可以与同一Task文件,因此具有相同的信息)

最佳

编辑 所提供的解决方案的一个原因,确实回答我的问题,但是我使用我的视图并将结果分组在我的代码(一个Django视图)中,结果非常快!

回答

0

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

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

  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" } 
     } 
    } 
    ] 
} 

关于从减少

减少功能必须将输入值减小到较小的输出值。如果你正在建设一个复合回报结构的减少,或者仅转化价值领域,而不是总结它,你可能基于评论被误用此功能

编辑: -

由于任务书太大而且你不想全部获取有两种方法可以采取:

  1. 将信息直接嵌入到作者中。因为你想从任务中获得的所有信息都是信息部分。 Couchdb和其他非sql数据库鼓励对数据进行反规范化处理以方便访问。

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

+0

谢谢你教我这个!你可能会考虑修复你的视图代码。但是,我尽量避免提取整个Task文档,因为它包含大量数据,我不想提取,因为这种情况下它没有用处和缓慢。因此,我需要采取更复杂的方法。 – enpenax

+0

@ user2033511你可以检查编辑的答案是否能解决你的问题。 –

+0

它有一种,但我现在用一种使用我的视图和手动过滤输出的方法,结果是速度提高了10倍(在我的情况下)。所以我会接受你的答案,因为它确实回答了这个问题,但对于我的特殊情况,我找到了一个解决方案 – enpenax