2009-09-23 67 views
10

底層問題 - 比方說我的文檔有「類別」時間戳。如果我想在「富」類別有時間戳的最後兩個小時內,這是所有的文件,很簡單:作爲CouchDB視圖的參數的多個鍵範圍

function (doc) { 
    emit([doc.category, doc.timestamp], null); 
} 

,然後查詢作爲

GET server:5894/.../myview?startKey=[foo, |now - 2 hours|]&endkey=[foo, |now|] 

問題就來了我當想要在類別foo酒吧,在最後兩個小時內。如果我不在乎時間,我可以通過鑰匙直接通過鑰匙收集。不幸的是,我沒有這樣的範圍選項。

我最終什麼事做在此期間被四捨五入時間戳兩個小時的塊,然後複查詢出來:

POST server:5894/.../myview 
keys=[[foo, 0 hours], [foo, 2 hours], [bar, 0 hours], [bar, 2 hours]] 

它的工作原理,但會變得混亂,如果我想回去大量的時間(與塊大小的關係)。

有沒有辦法將多個startKey/endKey對發送到一個視圖,類似於密鑰:[]可以發佈給密鑰的數組?

回答

4

你可能最好只做兩個查詢。 CouchDB可以很好地處理多個同時查詢,因此可以拆分多個進程/線程並分別查詢foo和bar文檔。

CouchDB目前不支持多個範圍查詢。 ORing和ANDing鍵在一個查詢中幾乎不可行。

+0

好吧,你可以通過按鍵或OR鍵,但是。謝謝。 – kolosy 2009-09-24 18:41:25

9

有一個CouchDB問題請求讓你這樣做。我附上了一張簡單的,沒有保證的補丁0.10.1到那個票可能適合你。它爲我,讓我做這樣的事情:在POST身體,這讓我獲得跨越多個跟蹤ID的所有的數據,日期範圍

{ 
    "keys": [ 
     { 
      "startkey": ["0240286524","2010","03","01"], 
      "endkey": ["0240286524","2010","03","07",{}] 
     }, 
     { 
      "startkey": ["0442257276","2010","03","01"], 
      "endkey": ["0442257276","2010","03","07",{}] 
     } 
    ] 
} 

。我打電話給group=true&group_level=1,通過跟蹤ID對結果進行分組。更深層次的組級別可以讓我通過跟蹤id | year,跟蹤id |年|月等進行分組等。

多連接對我來說是一個不可擴展的開銷,因爲我期望讓2000併發:)(不,新視圖不是一個選項 - 我們已經在400GB的數據加上一個視圖!)

問題和補丁是在https://issues.apache.org/jira/browse/COUCHDB-523

3

這已添加到新版本的CouchDB中。要添加開始/結束鍵的多個範圍,您可以使用POST請求你的看法,有身體,看起來是這樣的:

{ 
    "queries": [ 
    { "startkey": 10, "endkey": 11 }, 
    { "startkey": 16, "endkey": 18 } 
    ] 
} 

我知道這是一個老問題,但我最初發現它時,我是正是爲了這個!

+0

此文檔的任何文檔參考? – Isaac 2017-05-04 02:35:38

+0

還沒有,我已經承諾補丁文件,因爲我們還沒有他們!我做了博客,​​但如果另一個例子會有用https:// lornajane。net/posts/2017/multiple-search-keys-in-couchdb – 2017-05-04 08:08:15

+0

啊,我發現API文檔已經存在,他們在這裏:http://docs.couchdb.org/en/2.0.0/api /ddoc/views.html#sending-multiple-queries-to-a-view – 2017-06-23 07:25:15