CouchDB: Retorna os mais recentes documentos do tipo com base na data e hora
Eu tenho um sistema que aceita atualizações de status de uma variedade de fontes exclusivas e cada atualização de status cria um novo documento na seguinte estrutura:
<code>{ "type": "status_update", "source_id": "truck1231", "timestamp": 13023123123, "location": "Boise, ID" } </code>
Dados puramente exemplo, mas obtém a ideia.
Agora, esses documentos são gerados no intervalo, uma vez por hora. Uma hora depois, podemos inserir:
<code>{ "type": "status_update", "source_id": "truck1231", "timestamp": 13023126723, "location": "Madison, WI" } </code>
Tudo o que estou interessado em fazer é ver a atualização mais recente de cada fonte exclusiva. Atualmente estou fazendo isso pegando um mapa de:
<code>function(doc) { if (doc.type == "status_update") { emit(doc.source_id, doc); } } </code>
E uma redução 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>
E consultar os dados como uma redução comgroup=true
. Isso funciona como esperado e fornece um resultado com chave apenas das atualizações mais recentes.
O problema é que é terrivelmente lento e requer que eureduce_limit=false
na configuração do CouchDB.
Parece que tem que haver uma maneira mais eficiente de fazer isso. A atualização do mesmo documento não é uma opção - o histórico é importante, embora eu não exija isso neste caso. O processamento dos dados do lado do cliente não é uma opção, já que este é um CouchApp e a quantidade de documentos no sistema é realmente muito grande e não é prática para enviá-los por toda a rede.
Desde já, obrigado.