CouchDB: Zwróć najnowsze dokumenty typu na podstawie znacznika czasu

Mam system, który akceptuje aktualizacje statusu z różnych unikalnych źródeł, a każda aktualizacja statusu tworzy nowy dokument w następującej strukturze:

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

Dane są czystym przykładem, ale trafiają do idei.

Teraz te dokumenty są generowane w odstępach czasu, mniej więcej co godzinę. Godzinę później możemy wstawić:

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

Interesuje mnie tylko zobaczenie najnowszej aktualizacji z każdego unikalnego źródła. Obecnie robię to, biorąc mapę:

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

I zmniejszenie:

<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>

I odpytywanie danych jako zmniejszeniegroup=true. Działa to zgodnie z oczekiwaniami i zapewnia kluczowy wynik tylko najnowszych aktualizacji.

Problem jest strasznie powolny i wymaga ode mniereduce_limit=false w konfiguracji CouchDB.

Wydaje się, że musi to być skuteczniejszy sposób. Aktualizacja tego samego dokumentu nie jest opcją - historia jest ważna, nawet jeśli nie potrzebuję jej w tym przypadku. Przetwarzanie danych po stronie klienta nie jest opcją, ponieważ jest to CouchApp, a ilość dokumentów w systemie jest właściwie dość duża i niepraktyczna, aby wysłać je po całym przewodzie.

Z góry dziękuję.

questionAnswers(3)

yourAnswerToTheQuestion