2013-07-31 41 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

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