Получение списка документов с максимальным значением поля из представления CouchDB - PullRequest
3 голосов
/ 12 апреля 2011

Допустим, в моей базе данных 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 ]

4 голосов
/ 13 апреля 2011

Попробуйте использовать эту функцию карты:

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 сообщений, затем вы можете получить их все одним запросом с параметром keys или с помощью POST .

Я не уверен, что этоЭто лучший подход, но, похоже, он работает.

ОБНОВЛЕНИЕ: исправлена ​​карта для правильной обработки восстановления.

2 голосов
/ 12 апреля 2011

Вы собираетесь отправить постдату в качестве ключа, потому что ключи отсортированы. Например, вот так будет выглядеть ваша функция карты ...

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

Это даст вам все документы, отсортированные по возрастанию по дате. Если вы хотите по убыванию, то запрос с ?descending=true

Приветствие.

...