从 CouchDB 视图中获取具有最大字段值的文档列表

Dmi*_*riG 3 couchdb mapreduce

假设我的 CouchDB 数据库中有这样的博客条目:

{"name":"Mary", "postdate":"20110412", "subject":"this", "message":"blah"}
{"name":"Joe", "postdate":"20110411", "subject":"that", "message":"yadda"}
{"name":"Mary", "postdate":"20110411", "subject":"and this", "message":"blah-blah"}
{"name":"Joe", "postdate":"20110410", "subject":"and other thing", "message":"yada-yada"}
{"name":"Jane", "postdate":"20110409", "subject":"严肃的东西", "message":"不是真的"}

获取所有帖子的列表非常容易。但是如何从所有用户那里获得最新帖子的列表?

像那样:

{"name":"Mary", "postdate":"20110412", "subject":"this", "message":"blah"}
{"name":"Joe", "postdate":"20110411", "subject":"that", "message":"yadda"}
{"name":"Jane", "postdate":"20110409", "subject":"严肃的东西", "message":"不是真的"}

Mar*_*cio 5

试试这个地图功能:

function(doc) {
  if (doc.postdate && doc.name) {
    emit([doc.name, doc.postdate], 1);
  }
}
Run Code Online (Sandbox Code Playgroud)

以及以下减少功能:

function(keys, values, rereduce) {
  var max = 0,
      ks = rereduce ? values : keys;

  for (var i = 1, l = ks.length; i < l; ++i) {
    if (ks[max][0][1] < ks[i][0][1]) max = i;
  }
  return ks[max];
}
Run Code Online (Sandbox Code Playgroud)

并使用group_level=1. 它给你_id的职位,那么你可以检索它们都与一个查询keys参数或使用POST

我不确定这是否是最好的方法,但它似乎有效。

更新:修复了地图以正确处理 rereduce。