2017-01-11 69 views
0

我是couchdb的新手,我查看了文檔和SO帖子,但由於某種原因,這個簡單的查詢仍然無法解決。按日期查詢Couchdb同時保持排序順序

SELECT TOP 10 * FROM x WHERE DATE BETWEEN startdate AND enddate ORDER BY score 

UPDATE:它不能做。這是不幸的,因爲要獲得這種類型的數據,你必須從沙發上撤回數百萬條記錄(幾個 字段),然後自己進行篩選,排序或限制 以獲得期望的結果。我現在回到我的 使用_changes原始解決方案來捕獲和存儲其他地方我需要執行該查詢的數據。

這裏是我的更新視圖(感謝星):

emit([d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), score], doc.name); 

我需要做的是:

  • 始終排序得分降序
  • 可選的過濾器日期範圍(例如,僅當今)
  • 限制x

更新:感謝Dominic我更接近 - 但仍然有 問題。

?startkey=[2017,1,13,{}]&endkey=[2017,1,10]&descending=true&limit=10&include_docs=true 

這帶來了回來得分排序

但是兩個日期之間的文件,如果我想前10名不分日期的話,我只拿回按日期排序前10位(而不是得分)

回答

2

對於初學者,當在CouchDB中使用複雜鍵時,您可以從只有從左至右排序。這是一種常見的誤解,但請閱讀Views Collation以獲得更深入的解釋。 (當你在它,閱讀整個Guide to Views,以及因爲你要開始)

如果您希望能夠按分數進行排序,但日期僅過濾器,你可以通過打破做到這一點放下你的時間戳,只顯示你關心的學位。

function (doc) { 
    var d = new Date(doc.date) 
    emit([ d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), score ]) 
} 

最終你會輸出比你現在有一個更復雜的關鍵,但您的查詢,像這樣:

startkey=[2017,1,1]&endkey=[2017,1,1,{}] 

這將挑選出在2017年1月1日的所有文件,它會按分數排序! (按升序排列,只需將startkeyendkey換成降序,不需要改變視圖)

另外,請避免發出整個doc作爲視圖中的值。使用include_docs=true參數可能會更高效,並將您的值留空。(請參閱this SO question獲取更多信息)

有了這個確切的設置,您需要單獨的視圖才能以不同的精度進行查詢。例如,要按月查詢,只需使用年/月等。

但是,如果您願意/能夠在應用程序中對您的分數進行排序,則可以使用單個視圖來獲取所需的所有日期精度。例如:

function (doc) { 
    var d = new Date(doc.date) 
    emit([ d.getUTCFullYear(), d.getUTCMonth() + 1, d.getUTCDate(), d.getUTCHour(), d.getUTCMinutes(), d.getUTCSeconds(), d.getUTCMilliseconds() ]) 
} 

有了這個視圖和group_level參數,可以按年,月,日,小時,等拿到所有分數正如我所提到的,在這種情況下,它不會按分數進行排序但是,也許這會向你打開其他疑問。 (例如:本月有哪些用戶參與?)

+0

太好了,謝謝Dominic我現在要試試這個了。 我實際上並沒有存儲文檔,而是創建了一個新的文檔子集(帶有8個道具)(即:{Name:doc.prop.name,...} - 使用include_docs =真正的(和視圖=發射([鍵],1)當文檔有大約50個屬性?我可以測量,但聽起來像你會知道你的頭頂上:-) – schmoopy

+0

我也更新了我的問題後,發現了極限可以真正實現效果 - 但是你的解決方案可以滿足所有需求 - 非常感謝! – schmoopy

+0

我說得太快了,如果我增加了限制,那麼由於左右排序,它不能正常工作,我更新了我的問題。第100次評論,對所有更新感到抱歉) – schmoopy