Получить последний товар в группе CouchDB view - PullRequest
0 голосов
/ 04 декабря 2011

У меня есть несколько документов в 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); 
}

Моя попытка создать функцию уменьшения

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: ..."}

Я прочитал в Детальном руководстве , что ошибка возникает из-за того, что вы не должны возвращать полный документ из функции сокращения.Есть ли другой способ решить эту проблему?

Я ценю любую помощь, которую могу получить.

РЕДАКТИРОВАТЬ:

Я только что подумал об уродливом решении, позволяющем функции Reduce возвращать _id документа, а затем с помощью второго запроса извлечь документ.Что вы думаете об этом решении?Если бы вы могли найти хорошее решение для этого вместо этого, я был бы очень рад.

1 Ответ

2 голосов
/ 05 декабря 2011

Я нашел решение этой проблемы, я подумал, что было бы неплохо опубликовать его здесь, если кто-то окажется в подобной ситуации.

На самом деле решение было довольно простым, я просто добавил pathArray как вложенный массив к ключу. Таким образом, я сделал возможным запросить путь к файлу и получить только последнюю версию.

Это моя новая функция карты:

function(doc) {
  if(doc.doctype === "file")
  {
    var pathArr = doc.guipath.split(/\/|\\/);
    pathArr.splice(0,1);

    emit([pathArr,doc.created_at], doc);
  }
}

И я не использую функцию уменьшения.

Я запрашиваю это представление, добавляя следующие (или аналогичные) параметры:

?startkey=[["haha","file.ext"],{}]&endkey=[["haha","file.ext"]]&descending=true&limit=1

Таким образом, я могу быть уверен, что получаю только последнюю версию.

...