在我的沙发上,我有这样的文档对:
{
_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。
所以我认为有一些解决方案:
那么你会建议怎么做呢?
是的,有理由说明为什么信息是分开的(多个info
文档可以与同一个Final
文档相关,因此具有相同的信息)
最佳
修改 提供的解决方案确实回答了我的问题,但是我继续使用我的视图并将结果分组到我的代码(一个Django View)中,结果非常快!
答案 0 :(得分:0)
我现在需要一个视图,它会以某种方式为我提供信息,作者会附上信息。
因此,如果我理解正确的要求
视图应由作者姓名查询。
输出结果应该是作者的名称和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" }
}
}
]
}
的减少
reduce函数必须将输入值减小到较小的输出值。如果要在reduce中构建复合返回结构,或仅转换值字段,而不是对其进行汇总,则可能会滥用此功能
根据评论进行编辑: -
由于任务文档太大而您不想全部获取它,您可以采取两种方法
将信息直接嵌入作者中。因为你想从任务中得到的只是信息部分。 Couchdb和其他没有sql数据库鼓励数据的非规范化以便于访问。
使用list function将大型json输出修改为可供您使用的格式。