2011-01-13 25 views
5

我有一個CouchDB的視圖「record_by_date_product」,定義如下:如何查詢使用複合鍵的couchdb視圖?

function(doc) { 
    emit([doc.logtime, doc.product_id], doc); 
} 

我想運行一個查詢這是這樣的:

(logtime > fromdate & logtime < todate) & product_id in (1,2,6) 

這可能與這種觀點?

我也使用couchdb python庫來訪問couchdb。下面的代碼片段:

server = couchdb.Server() 
db = server['mydb'] 

results = db.view('_design/record_by_date_product/_view/record_by_date_product') 

此頁http://packages.python.org/CouchDB/client.html#viewresults規定,我們可以使用一個startkey和endkey。但我無法讓它工作。

謝謝

回答

5

我想我只是找到了確切的答案:

設計視圖 'sampleview',這是這樣的:

{ 
    "records_by_date_product": { 
     "map": "function(doc) {\n emit([doc.prod_id, doc.logtime], doc);\n}" 
    } 
} 

讓我們說,查詢參數是:

prod_id in [1,3] 
from_date = '2010-01-01 00:00:00' 
to_date = '2010-01-02 00:00:00' 

那麼你將不得不在相同的視圖上運行2個單獨的查詢:

http://localhost:5984/db/_design/sampleview/_view/records_by_date_product?startkey='\["1,2010-01-01%2000:00:00"\]'&endkey='\[1,"2010-01-02%2000:00:00"\]' 

http://localhost:5984/db/_design/sampleview/_view/records_by_date_product?startkey='\[2,"2010-01-01%2000:00:00"\]'&endkey='\[2,"2010-01-02%2000:00:00"\]' 

請注意,除了在第二個查詢中更改了prod_id之外,每次都運行相同的查詢。結果必須稍後整理。希望這可以幫助!

3

確切的查詢是不可能的。正如文檔所建議的那樣,您可以在特定鍵範圍內的視圖中獲取所有內容。視圖是經過排序的數據結構,因此所有CouchDB都可以完成此請求,即找到開始鍵並開始返回項目,直到您點擊結束鍵。

您應該用於此查詢的策略取決於數據本身的特性。最重要的是,如果僅使用密鑰的第一部分(logtime),並且在Python中迭代這些部分,則會浪費大量時間來清除項目,從而清除product_id不匹配的項目?如果是這樣,您應該考慮編寫另一個主要按product_id排序的視圖。如果沒有,請繼續使用除草方法。

-1

這個怎麼樣的解決方案:

  1. 我創建用於logTime Description該條爲索引中的各產品的圖。
  2. 訪問如果需要的話,並使用範圍過濾theresults每個視圖 - [沒有fromdate TODATE]
  3. 做3爲輸入參數的每個產品和整理結果

這有一個缺點,對於每一個產品我們將不得不創建一個視圖,這看起來像一個手動過程。

只是一個念頭!讓我知道你的意見。

+0

它可以比這更簡單。只需將您的按鍵順序顛倒過來,以便文檔按產品排序,然後按日誌時間排序。查詢相同的視圖三次,在您想要的時間範圍內查找每個產品。這是我提交的答案中的第二個建議,所以如果您喜歡它,請將其標記爲已接受:) – 2011-01-14 17:12:13

+0

您好,我應該如何「在時間範圍內查找每件產品」?我想這正是我問的問題。事實是,我們只能將日期或範圍[startdate enddate]發送到視圖。但我們無法同時發送範圍和產品ID。我正在考慮使用接受任意數量的查詢參數的列表。將提供更新。謝謝! – 2011-01-14 17:33:38