开发者

Getting a list of documents with a maximum field value from CouchDB view

开发者_如何学GoLet's say I have blog entries like these in my CouchDB database:

{"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"}

It's pretty easy to get a list of all posts. But how do I get a list of latest posts from all the users?

Like that:

{"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"}


Try with this map function:

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

and the following reduce function:

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

and query it with group_level=1. It gives you the _id of the posts, then you can retrieve them all with a single query with the keys parameter or using a POST.

I am not sure if this is the best approach, but it seems to work.

UPDATE: fixed map to handle rereduce correctly.


You're going to emit the postdate as the key because keys are sorted. For example, this is what your map function will look like...

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

That will give you all the docs sorted ascending by postdate. If you want descending then query with ?descending=true

Cheers.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜