我需要你关于CouchDB减少功能的帮助。 我有一些文档,如:
{'about':'1', 'foo':'a1','bar':'qwe'}
{'about':'1', 'foo':'a1','bar':'rty'}
{'about':'1', 'foo':'a2','bar':'uio'}
{'about':'1', 'foo':'a1','bar':'iop'}
{'about':'2', 'foo':'b1','bar':'qsd'}
{'about':'2', 'foo':'b1','bar':'fgh'}
{'about':'3', 'foo':'c1','bar':'wxc'}
{'about':'3', 'foo':'c2','bar':'vbn'}
正如您所看到的,它们都具有相同的键,只是值是不同的。 我的意思是使用Map / Reduce,我的回报期望是:
'rows':[ 'keys':'1','value':{'1':{'foo':'a1', 'at':'rty'},
'2':{'foo':'a2', 'at':'uio'},
'3':{'foo':'a1', 'at':'iop'}}
'keys':'1','value':{'foo':'a1', 'bar','rty'}
...
'keys':'3','value':{'foo':'c2', 'bar',vbn'}
]
这是我的Map功能的结果:
'rows':[ 'keys':'1','value':{'foo':'a1', 'bar','qwe'}
'keys':'1','value':{'foo':'a1', 'bar','rty'}
...
'keys':'3','value':{'foo':'c2', 'bar',vbn'}
]
但我的Reduce功能不起作用:
function(keys,values,rereduce){
var res= {};
var lastCheck = values[0];
for(i=0; i<values.length;++i)
{
value = values[i];
if (lastCheck.foo != value.foo)
{
res.append({'change':[i:lastCheck]});
}
lastCheck = value;
}
return res;
}
是否有可能拥有我期望的或我需要以其他方式使用?
答案 0 :(得分:2)
您不应该在reduce函数中执行此操作。正如couchdb wiki所解释的那样: -
如果要在reduce中构建复合返回结构,或仅转换值字段,而不是对其进行汇总,则可能会滥用此功能。
您可以采用两种方法
在应用层转换结果。
列表功能很简单。我会在这里解释一下:
视图列表保存在密钥列表下的设计文档中。像这样:
"lists":{
"formatResults" : "function(head,req) {....}"
}
要调用列表功能,请使用此类网址
http://localhost:5984/your-database/_design/your-designdoc/_list/your-list-function/your-view-name
以下是列表功能的示例
function(head, req) {
var row = getRow();
if (!row){
return 'no ingredients'
}
var jsonOb = {};
while(row=getRow()){
//construct the json object here
}
return {"body":jsonOb,"headers":{"Content-Type" : "application/json"}};
}
getRow
功能对我们很感兴趣。它包含视图的结果。所以我们可以像
row.key
代码
row.value
现在你要做的就是按照你想要的方式构建json然后send
。
顺便说一句,您可以使用log 调试你的功能。
我希望这会有所帮助。
答案 1 :(得分:0)