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:
{
"type": "status_update",
"source_id": "truck1231",
"timestamp": 13023123123,
"location": "Boise, ID"
}
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ć:
{
"type": "status_update",
"source_id": "truck1231",
"timestamp": 13023126723,
"location": "Madison, WI"
}
Interesuje mnie tylko zobaczenie najnowszej aktualizacji z każdego unikalnego źródła. Obecnie robię to, biorąc mapę:
function(doc) {
if (doc.type == "status_update") {
emit(doc.source_id, doc);
}
}
I zmniejszenie:
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;
}
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ę.