2013-07-31 38 views
0

我在Couch DB(所有版本1.01-1.31)中遇到問題。使用CouchDB進行高級日查詢

我的數據是這樣的:

{ 
    "_id": "9a12b7fa4b886640be06f74b814306a6", 
    "_rev": "1-420c723f8c8f7921ead3df04bfc9ade5", 
    "client_id": "008", 
    "day": 1, 
    "month": 1, 
    "year": 2013, 
    "comment": "cool" 
} 

而且我希望看到客戶端的時間跨度做了所有的交易,讓比如說1月份:

所以我的地圖功能是這樣的:

function(doc) { 
    emit([doc.client_id, doc.day,doc.month, doc.year], doc); 
} 

所以我查詢與startkey和endkey像

http://localhost:5984/test/_design/clients/_view/by_cid_day_month_year?startkey=[%22007%22,1,1,2013]&endkey=[%22007%22,32,1,2013] 

但是不是從1月份的client_id = 007獲取所有文檔,而是獲取與007匹配的所有記錄。

因此,必須有一些我誤解的內容。我的查詢出了什麼問題?它應該怎麼看?

我的想法是,我只能看到特定日期的日誌,或者從第一天到第六天。

我試圖把鍵,天,月和年作爲字符串,但結果總是相同的,甚至有時候很奇怪,就像在上面的例子中,我會在九月份找到一條記錄(9),但如果我去四月f.ex。我得到所有記錄。

我不明白這一點。這應該是非常簡單的。

+1

不是我的套件,但你不應該'發出([doc.client_id,doc.year,doc.month,doc.day] DOC);'(即最顯著第一),使比較工作? –

+0

沒有區別 –

+1

奇數,與原來的一樣,所有的日子都在1到32之間,所以他們會在退回到月份之前被包括在內(即1到32之間的所有天數,無論這個月是否包含在內, 007)。隨着新排放,我看不出會發生什麼。 –

回答

2

由於比賽從開始到結束並停在第一次機會,因此您需要首先發出最重要的搜索條件。在原始查詢中,您在月份之前發出日期,無論月份或年份如何,都會導致日期匹配。

如果你改爲;

emit([doc.client_id, doc.year, doc.month, doc.day], doc); 

比較將首先檢查年份,然後是月份和上次日期,這就是您的意思。作爲一個方面說明,爲了匹配任何日期,我似乎記得你可以簡化你的搜索;

...by_cid_year_month_day?startkey=[%22007%22,2013,1]&endkey=[%22007%22,2013,1,{}] 

...自從離開最後一個元素出來,使數組排序之前的任何陣列,它是長度(任何日期),以及任何日後{}將整理。搜索整個2013年將以同樣的方式;

...by_cid_year_month_day?startkey=[%22007%22,2013]&endkey=[%22007%22,2013, {}] 
+0

謝謝。空的哈希事物是非常有用的 –