2014-10-08 51 views
1

使用CouchDB的,具有以下JSON:如何查詢多個關鍵標準?

{"total_rows":3,"offset":0,"rows":[ {"id":"bc26e5eae7f8c8c3486818e7e7971df0","key":{"user":"[email protected]","pal":["igol ≠ eagle"],"fecha":"10/5/2014"},"value":null},{"id":"cf0dc2e2874776958c59f2f544b5a750","key":{"user":"[email protected]","pal":["kat ≠cat"],"fecha":"10/6/2014"},"value":null},{"id":"df4ec96088ed52096db064f2ebd2310b","key":{"user":"[email protected]","pal":["dok ≠ duck"],"fecha":"10/7/2014"},"value":null}]} 

我想查詢特定的用戶和特定日期:

例如: 用戶= 「[email protected]」 &出生日期: 「2014年10月6日」

我也試過: 用戶%3Dlili%40def.com%26fecha%3A10%2F6%2F2014

不用說,它不是目前正在爲I E xpected(顯示所有結果,不僅僅是需要的寄存器)。

我的看法是FUNC:

function(doc) { 

    if (doc.USER){ 

     emit({user:doc.USER, pal:doc.palabras, fecha:doc.fecha}); 

    } 
} 

問候。

回答

2

請記住,CouchDB視圖只是在索引時建立的鍵/值查找,而不是查詢時間。在那一刻你發出一個沒有價值的鑰匙。如果你想通過兩個值來查找東西,你需要發出一個複合鍵(數組):

function(doc) { 
    if (doc.USER) { 
     emit([doc.USER, doc.fecha], doc); 
    } 
} 

然後你可以看一下通過將數組作爲關鍵配套文件:

?key=%5B%22lili%40def.com%22%2C%20%2210%2F6%2F2014%22%5D 

您可以對此進行優化(例如,發出null值並使用include_docs減小視圖的大小),但這應該使您在正確的軌道上運行。

+0

謝謝。我仍然在研究我的想法(曾經使用過mysql,並試圖「讓couchdb」像我以前那樣工作)。問候。 – 2014-10-18 14:43:06

0

我做的和Ant P一樣,但我傾向於使用字符串。

function (doc) { 
    if (doc.USER) { 
    emit('user-' + doc.USER + '-' + doc.fecha, doc); 
    } 
} 

我也強烈建議發射null代替doc作爲值。

請記住,您總是可以放出多次,具體取決於您需要什麼類型的查詢。

例如,如果您在兩個日期之間查找特定用戶的所有帖子,則可以執行以下操作。

function (doc) { 
    if (doc.type == "post") { 
    emit('user-' + doc.nombre, null); 
    emit('fecha-' + doc.fecha, null); 
    } 
} 

然後你會查詢視圖兩次_view/posts?key="user-miUsario"_view/posts?start_key="fecha-1413040000000"&end_key="fecha-1413049452904"。然後,一旦你從這兩個視圖中獲得了所有的id,就可以使用_all_docs來獲取原始文檔。

您最終提出了三個請求,但它節省了視圖中的磁盤空間,有效負載更小,因爲您返回null,而且代碼更簡單,因爲您可以多種方式查詢相同的視圖。

+0

非常感謝,值得一提的建議 – 2014-10-18 14:42:14