我有接受來自各種獨特的資源狀態更新的系統,每個狀態更新會在以下結構的新文檔類型的最新文件:CouchDB的:返回基於時間戳
{
"type": "status_update",
"source_id": "truck1231",
"timestamp": 13023123123,
"location": "Boise, ID"
}
數據純粹例如,但可以理解。
現在,這些文件每隔一小時產生一次,大約一個小時左右。一個小時後,我們可能會在插入:
{
"type": "status_update",
"source_id": "truck1231",
"timestamp": 13023126723,
"location": "Madison, WI"
}
所有我感興趣的是做的是看到從每一個獨特的源中的最新更新。目前,我正在做這個通過採取地圖:
function(doc) {
if (doc.type == "status_update") {
emit(doc.source_id, doc);
}
}
並有減少的:
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;
}
和查詢數據作爲與group=true
減少。這按預期工作,並提供只有最新更新的密鑰結果。
問題是它非常緩慢,需要我在CouchDB配置中的reduce_limit=false
。
感覺就像這樣做一定要有更高效的方法。更新相同的文檔不是一種選擇 - 歷史很重要,即使在這種情況下我不需要它。處理數據客戶端不是一個選項,因爲這是一個CouchApp,而且系統中的文檔數量實際上相當大,並且不實際可以通過網絡發送它們。
在此先感謝。
如何更新文檔本身,並將「舊」版本作爲附件添加到相關文檔中? (並重復每個新的狀態變化的過程) –
哇,truck1231驅動器每小時1,700英里!不錯。 – JasonSmith
我在那裏等待一個機智的評論;) – radicand