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