我正在使用CouchDB存儲有關事件的數據。每個事件都有一個開始日期/時間和結束日期/時間。我想現在創建一個視圖,它可以讓我獲得在特定日期/時間發生的所有事件的列表。但是這些事件並沒有單一的日期,他們可以在幾天內調整範圍。CouchDB中的範圍鍵視圖
現在我不知道如何在我的視圖功能中反映這一點。不幸的是,我需要精細的分級,所以每分鐘發一個密鑰可能不是一個有效的解決方案。那我該怎麼做?
在此先感謝!
我正在使用CouchDB存儲有關事件的數據。每個事件都有一個開始日期/時間和結束日期/時間。我想現在創建一個視圖,它可以讓我獲得在特定日期/時間發生的所有事件的列表。但是這些事件並沒有單一的日期,他們可以在幾天內調整範圍。CouchDB中的範圍鍵視圖
現在我不知道如何在我的視圖功能中反映這一點。不幸的是,我需要精細的分級,所以每分鐘發一個密鑰可能不是一個有效的解決方案。那我該怎麼做?
在此先感謝!
好的,無論如何,這是一個解決方案!我只是與CouchDB的Jan(Lehnardt)平起牀來,他告訴我可以在地圖中多次使用emit()
。直到現在我還不知道的東西。
爲了讓自己更容易,我假設您的結束時間和開始時間已經是TIMESTAMP值。如果不是,則需要將其轉換爲地圖或通常切換到它們。
我還會假設一個事件在一分鐘內開始(例如16:51:00
),而不是在16:51:23
。在結束日期相同。
實例文檔:
{
"_id" : "super-random-id",
"name" : "event 1",
"start" : "TIMESTAMP",
"end" : "TIMESTAMP"
}
這裏的地圖:
function (doc) {
if (doc.start == undefined || doc.end == undefined) {
return;
}
var current = doc.start;
while (current <= doc.end) {
emit(current, doc.id);
current = current + 60; // increment by 1 minute
}
}
那麼它應該很容易與startkey
和endkey
查詢。您可以在這裏添加_list
。
感謝您的回答,但正如我在我的問題中所寫的那樣,「每分鐘發一個鍵可能不是一個有效的解決方案」。這是因爲我手上有很長的時間範圍(即多天)。另一方面,我仍然需要一個很好的粒度。這隻能通過每個文檔發佈數千個密鑰來實現,據我所知,這並不能很好地擴展。但再次感謝您的想法。 – 2010-06-30 17:21:36
那麼,視圖會被計算一次,然後被讀取。我不認爲這應該是一個問題,但我明白你的意思。 – Till 2010-07-01 17:29:46
我發現最後用GeoCouch一個很好的解決方案:http://www.diretto.org/2010/08/efficient-time-based-range-queries-in-couchdb-using-geocouch/
這是正確的答案,但不幸的是,鏈接已經死亡。 – dgreisen 2015-03-08 13:41:25
來自文章:GeoCouch「允許使用邊界框進行空間搜索... GeoCouch的空間索引預計GeoJSON條目(它也不受任何獨特格式如WGS84的約束),因此我們將時間段作爲邊界框放置,值被忽略並設置爲0,緯度值表示編碼爲時間戳的時間開始和結束點。因此,我們...有效地查詢給定時間段內的所有條目。「 http://web.archive.org/web/20131121023735/http://www.diretto.org/2010/08/efficient-time-based-range-queries-in-couchdb-using-geocouch/ – dgreisen 2015-03-08 13:45:40
艱難的,我不認爲範圍查詢CouchDB的拿手好戲。 – Till 2010-06-30 15:50:57