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

时间:2011-04-12 15:06:25

标签: 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":"Serious stuff", "message":"Not really"}

很容易获得所有帖子的列表。但是如何获得所有用户的最新帖子列表?

就像那样:

{"name":"Mary", "postdate":"20110412", "subject":"this", "message":"blah"}
{"name":"Joe", "postdate":"20110411", "subject":"that", "message":"yadda"}
{"name":"Jane", "postdate":"20110409", "subject":"Serious stuff", "message":"Not really"}

2 个答案:

答案 0 :(得分:4)

尝试使用此地图功能:

function(doc) {
  if (doc.postdate && doc.name) {
    emit([doc.name, doc.postdate], 1);
  }
}

以及以下减少功能:

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];
}

并使用group_level=1进行查询。它会为您提供_id个帖子,然后您可以使用the keys parameter or using a POST的单个查询检索所有帖子。

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

UPDATE:修复了正确处理rereduce的地图。

答案 1 :(得分:2)

您将发布postdate作为密钥,因为密钥已排序。例如,这就是你的地图功能的样子......

function(doc) {
  if(doc.postdate) {
    emit(doc.postdate, doc);
  }
}

这将为您提供按日期升序排序的所有文档。如果您想降序,请使用?descending=true

进行查询

干杯。