我需要您有关 CouchDB reduce 函数的帮助。 我有一些文档,例如:
{'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;
}
是否有可能得到我所期望的或者我需要使用其他方式?
最佳答案
您不应该在reduce函数中执行此操作。作为couchdb wiki解释:-
If you are building a composite return structure in your reduce, or only transforming the values field, rather than summarizing it, you might be misusing this feature.
您可以采取两种方法
在应用程序层转换结果。
使用list function 。
列表功能很简单。我将尝试在这里解释它们:
类似 View 的列表保存在设计文档中的关键列表下。就像这样:
"lists":{
"formatResults" : "function(head,req) {....}"
}
要调用列表函数,您可以使用这样的 url
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
函数感兴趣。它包含 View 的结果。所以我们可以这样查询
row.key
用于键
row.value
表示值
您现在要做的就是按照您想要的方式构造 json,然后发送
它。
顺便说一句,你可以使用log 调试您的功能。
我希望这会有所帮助。
关于list - 如何返回我在reduce函数中创建的JSON对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24428855/