CouchDB: Neueste Dokumente basierend auf dem Zeitstempel zurückgeben

Ich habe ein System, das Statusaktualisierungen aus verschiedenen eindeutigen Quellen akzeptiert, und jede Statusaktualisierung erstellt ein neues Dokument in der folgenden Struktur:

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

Daten rein beispielhaft, vermittelt aber die Idee.

Diese Dokumente werden jetzt im Abstand von ungefähr einer Stunde erstellt. Eine Stunde später könnten wir die Einfügung:

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

Ich möchte nur das neueste Update von jeder einzelnen Quelle sehen. Zur Zeit mache ich das mit einer Karte von:

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

Und eine Reduzierung von:

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

Und die Daten abfragen als verkleinern mitgroup=true. Dies funktioniert wie erwartet und liefert nur das Ergebnis der neuesten Aktualisierungen.

Das Problem ist, dass es furchtbar langsam ist und von mir verlangt wirdreduce_limit=false in der CouchDB Konfiguration.

Es scheint, als müsse dies auf effizientere Weise geschehen. Das gleiche Dokument zu aktualisieren ist keine Option - der Verlauf ist wichtig, obwohl ich ihn in diesem Fall nicht benötige. Die Verarbeitung der Daten auf der Client-Seite ist ebenfalls keine Option, da es sich um eine CouchApp handelt und die Anzahl der Dokumente im System sehr groß ist und es nicht praktisch ist, sie über das gesamte Netzwerk zu senden.

Danke im Voraus.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage