2011-04-06 51 views
5

目前我正在試圖創建一個視圖和查詢,以適應這個SQL查詢:多個鍵值的CouchDB視圖的查詢

SELECT * FROM articles 
WHERE articles.location="NY" OR articles.location="CA" 
ORDER BY articles.release_date DESC 

我試圖創建一個複雜的關鍵視圖:

function(doc) { 
    if(doc.type == "Article") { 
    emit([doc.location, doc.release_date], doc) 
    } 
} 

然後使用startkeyendkey檢索一個位置並在發佈日期對結果進行排序。

.../_view/articles?startkey=["NY", {}]&endkey=["NY"]&limit=5&descending=true 

這工作正常。

但是,我怎麼能發送多個startkeys和endkeys我的看法,以模仿

WHERE articles.location="NY" OR articles.location="CA"

+0

雖然答案是正確的,它看起來像這仍然是不可能的,看來這將是隨時可用2.0出來:https://issues.apache.org/jira/browse/ COUCHDB-523 – 2015-05-14 15:06:50

回答

7

我的拱門剋星,多米尼克,是對的。

此外,它是永遠不可能按標準A查詢,然後按CouchDB中的標準B排序。爲了換取這種不便,CouchDB保證可擴展的,可靠的對數查詢時間。你有一個選擇。

  • 店鋪在其自己的數據庫視圖輸出,並且使新的視圖通過標準乙排序
  • ,行之後進行排序,它可以是
    • 排序客戶機一旦收到行
    • 排序服務器端,在_list功能。這很好,但請記住它不是最終可擴展的。如果您有數百萬行,則_list函數可能會崩潰。
+5

Arch nemesis ?? :O – 2011-04-07 13:27:03

+0

我打算至少有50000個文檔,所以在客戶端進行排序是不可能的:)並且_list函數不會縮放...所以剩下的只有2個選項是將視圖輸出存儲在其中自己的數據庫,並創建一個新的視圖,或使用Lucene搜索引擎?如何解決這個問題?假設我有50個地點,我不想打50個電話到我的視圖,然後遍歷結果以獲得10個最近的文章。 – ephemere 2011-04-07 15:32:08

+0

@ephemere,我知道臨時數據庫並不理想。然而,一旦你已經得到了它,你可以用它來處理類似的情況,按A選擇,按B排序。你只需要讀取_view'行並將它們變成'_bulk_docs'行。 – JasonSmith 2011-04-07 17:23:08

4

簡短的回答是,您目前不能使用使用多個startkey/endkey組合。

您將不得不做2個單獨的查詢,或者您可以隨時在lucene搜索引擎上添加以獲得更強大的搜索功能。

可能在查詢中使用多個key參數。請參閱Couchbase CouchDB documentation on multi-document fetching

+0

+1。我冒昧地在同一時間鏈接到多個'key'查詢的文檔(種類,但不是OR查詢)。 – JasonSmith 2011-04-07 04:49:31

+0

此解決方案的問題是我不想指定日期。比方說,我需要紐約或CA最近的10篇文章,我怎麼用密鑰寫這篇文章? {「NY」,{}],[「CA」,{}]] } – ephemere 2011-04-07 15:24:35

+0

多文檔抓取的頁面是404.您可能需要:http://www.couchbase的.com /文檔/ couchbase單服務器-1-2/couchbase-API-design_db設計-designdoc - 視圖 - viewname_post-的multidoc。html – Cheeso 2012-06-28 17:11:43