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, а количество документов в системе на самом деле довольно велико, и отправлять их по сети практически невозможно.
Заранее спасибо.