我在CouchDB中有一些包含日期和路径的文档。我想要一个可以通过路径搜索的视图(可能使用startkey和endkey),并且对于该路径,我希望视图返回日期最新的文档。
我的数据如何显示的一个小例子
{
"path": "abc",
"created_at": "2011-12-03T18:23:49.058Z"
}
{
"path": "abc",
"created_at": "2011-12-03T11:32:42.123Z"
}
{
"path": "cde",
"created_at": "2011-12-06T15:52:34.523Z"
}
我当前的地图功能
function(doc) {
var pathArr = doc.path.split(/\/|\\/);
pathArr.splice(0,1);
emit(pathArr, doc);
}
我尝试创建缩减功能
function(keys, values) {
var currTime = -Infinity;
var retDoc;
for (var i = 0, v; v = values[i]; i++) {
var dateInMs = new Date(v.created_at).getTime();
//if this doc has a later than than previously latest date found
if(dateInMs >= currTime)
{
currTime = dateInMs;
retDoc = v;
}
}
return retDoc;
}
这会导致错误
{"error":"reduce_overflow_error","message":"Reduce output must shrink more rapidly: Current output: ..."}
我在the Definitive Guide中读到错误,因为你不应该从reduce函数返回一个完整的文档。还有其他方法可以解决这个问题吗?
我感谢所有帮助。
修改
我只是想到了让reduce函数返回文档的_id然后通过第二个请求获取文档的丑陋解决方案。您如何看待这个解决方案?如果你能找到一个好的解决方案,我将非常高兴。
答案 0 :(得分:2)
我找到了一个解决方案,我觉得如果有人在类似的情况下发布它会很好。
实际上解决方案非常简单,我只是将pathArray作为嵌套数组添加到键中。这样我就可以查询文件的路径,只获取最新版本。
这是我的新地图功能:
function(doc) {
if(doc.doctype === "file")
{
var pathArr = doc.guipath.split(/\/|\\/);
pathArr.splice(0,1);
emit([pathArr,doc.created_at], doc);
}
}
我不使用reduce函数。
我通过添加以下(或类似)参数来查询此视图:
?startkey=[["haha","file.ext"],{}]&endkey=[["haha","file.ext"]]&descending=true&limit=1
这样我可以肯定我只得到最新版本。