2011-05-28 82 views
5

我知道你可以傳遞一個鍵或一個範圍來在CouchDB中返回記錄,但我想要做這樣的事情。查找X值爲X的X記錄。帶CouchDB的複合鍵,查找多條記錄

因此,例如,在常規SQL中,可以說我想要返回記錄,其ID爲5,7,29,102。我會做這樣的事情:

SELECT * FROM sometable WHERE id = 5 OR id = 7 or id = 29 or id = 102 

是否有可能做到這一點在CouchDB中,我在那裏折騰所有我想要的鍵陣列中找到的值,然後CouchDB的搜索所有可能存在的那些記錄在「關鍵參數」

回答

4

你可以做一個POST as documented on CouchDB wiki。您傳遞請求正文中的密鑰列表。

{"keys": ["key1", "key2", ...]} 

缺點是POST請求沒有被瀏覽器緩存。

或者,您可以使用帶參數keys的GET獲得相同的響應。例如,可以查詢與該視圖_all_docs

/DB/_all_docs?keys=["ID1","ID2"]&include_docs=true 

其中,適當的URL編碼,就變成了:

/DB/_all_docs?keys=%5B%22ID1%22,%22ID2%22%5D&include_docs=true 

這應該提供更好的緩存能力,但請記住,在每個文檔更新_all_docs變化。有時,您可以通過僅使用所需文檔定義自己的視圖來解決此問題。

+1

性能與一個查詢不同(即使是一系列的鍵)。在內部,CouchDB只需重新運行每個鍵的查找。您節省的所有資源都是往返HTTP延遲。 (您的代碼也可能更簡單,缺陷更少。) – JasonSmith 2011-05-30 00:54:27

2

有了直觀的功能,這是不可能的。但是,您可以使用_list函數來完成相同的結果。

+0

您可以在任何視圖(甚至_all_docs)上執行此操作,但您需要執行POST而不是GET。 – 2011-05-29 16:25:25

+2

使用密鑰列表發佈是一種解決方法。它不是句法糖,即相同的東西,但更方便。它不**是同一件事。在內部,CouchDB逐個查找每個關鍵字。性能和可伸縮性與GET密鑰(或密鑰範圍)查找不同。但正如Marcello在答覆中所表明的那樣,確實可以非常方便。 – JasonSmith 2011-05-30 00:51:44

+0

我認爲這取決於密鑰列表是否總是相同,或者您是否希望能夠在「運行時」指定密鑰列表。如果列表是固定列表,您可以創建一個返回匹配文檔的索引(_list函數)。如果列表是任意的(一個參數),那麼couchdb將不得不爲每個鍵「運行查找」,所以你不能比POST方法更好。 – 2011-06-01 02:36:37