CouchDB: вернуть новейшие документы типа на основе метки времени

У меня есть система, которая принимает обновления статуса из разных уникальных источников, и каждое обновление статуса создает новый документ в следующей структуре:

<code>{
 "type": "status_update",
 "source_id": "truck1231",
 "timestamp": 13023123123,
 "location": "Boise, ID"
}
</code>

Данные чисто примерные, но донесут идею до конца.

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

<code>{
 "type": "status_update",
 "source_id": "truck1231",
 "timestamp": 13023126723,
 "location": "Madison, WI"
}
</code>

Все, что мне интересно, - это видеть последние обновления из каждого уникального источника. Сейчас я делаю это, взяв карту:

<code>function(doc) {
  if (doc.type == "status_update") {
    emit(doc.source_id, doc);
  }
}
</code>

И сокращение:

<code>function(keys, values, rereduce) {
  var winner = values[0];
  var i = values.length;
  while (i--) {
    var val = values[i];
    if (val.timestamp > winner.timestamp) winner = val;
  }
  return winner;
}
</code>

И запрос данных как сокращение сgroup=true, Это работает, как ожидалось, и обеспечивает ключевой результат только последних обновлений.

Проблема в том, что он очень медленный и требует от меняreduce_limit=false в конфиге CouchDB.

Такое ощущение, что должен быть более эффективный способ сделать это. Обновление одного и того же документа не вариант - история важна, хотя в этом случае я не требую ее. Обработка данных на стороне клиента не является вариантом, так как это CouchApp, а количество документов в системе на самом деле довольно велико, и отправлять их по сети практически невозможно.

Заранее спасибо.

Ответы на вопрос(3)

Ваш ответ на вопрос