获取最新的项目在组CouchDB视图中

时间:2011-12-04 17:46:19

标签: javascript database group-by couchdb mapreduce

我在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然后通过第二个请求获取文档的丑陋解决方案。您如何看待这个解决方案?如果你能找到一个好的解决方案,我将非常高兴。

1 个答案:

答案 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

这样我可以肯定我只得到最新版本。