CouchDB: Devuelve los documentos más nuevos de tipo según la marca de tiempo
Tengo un sistema que acepta actualizaciones de estado de una variedad de fuentes únicas, y cada actualización de estado crea un nuevo documento en la siguiente estructura:
<code>{ "type": "status_update", "source_id": "truck1231", "timestamp": 13023123123, "location": "Boise, ID" } </code>
Datos puramente de ejemplo, pero da a entender la idea.
Ahora, estos documentos se generan a intervalos, una vez más o menos una hora. Una hora después, podríamos insertar:
<code>{ "type": "status_update", "source_id": "truck1231", "timestamp": 13023126723, "location": "Madison, WI" } </code>
Todo lo que me interesa es ver la última actualización de cada fuente única. Actualmente estoy haciendo esto tomando un mapa de:
<code>function(doc) { if (doc.type == "status_update") { emit(doc.source_id, doc); } } </code>
Y una reducción de:
<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>
Y consultar los datos como reducir congroup=true
. Esto funciona como se esperaba y proporciona un resultado clave de solo las últimas actualizaciones.
El problema es que es terriblemente lento y me obliga areduce_limit=false
En la configuración de CouchDB.
Se siente como que tiene que haber una manera más eficiente de hacer esto. Actualizar el mismo documento no es una opción: el historial es importante, aunque no lo requiero en este caso. El procesamiento del lado del cliente de los datos tampoco es una opción, ya que se trata de un CouchApp y la cantidad de documentos en el sistema es bastante grande y no es práctico enviarlos por cable.
Gracias por adelantado.