【问题标题】:Get latest item by in group CouchDB view在组 CouchDB 视图中获取最新项目
【发布时间】:2011-12-04 17:46:19
【问题描述】:

我在 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); 
}

我尝试创建一个reduce函数

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然后通过第二个请求获取文档的丑陋解决方案。你觉得这个解决方案怎么样?如果你能找到一个好的解决方案,我会很高兴。

【问题讨论】:

    标签: javascript database group-by couchdb mapreduce


    【解决方案1】:

    我找到了解决方案,如果有人遇到类似情况,我认为最好将其发布在这里。

    解决方案实际上很简单,我只是将 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
    

    这样我可以确定我只得到最新的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多