使用CouchDB的高级日查询

使用CouchDB的高级日查询,couchdb,Couchdb,我对coach DB(所有版本1.01-1.31)中的视图有问题 我的数据如下所示: { "_id": "9a12b7fa4b886640be06f74b814306a6", "_rev": "1-420c723f8c8f7921ead3df04bfc9ade5", "client_id": "008", "day": 1, "month": 1, "year": 2013, "comment": "cool" } 我希望看到客户在一段时间内完成的所有

我对coach DB(所有版本1.01-1.31)中的视图有问题

我的数据如下所示:

{
   "_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]
但是,我并没有从一月份开始获取所有client_id=007的文档,而是获取所有与007匹配的记录

所以一定有我误解的东西。我的问题出了什么问题?它应该看起来怎么样

我的想法是,我也可以只看到特定日期的日志,或者说从1月1日到1月6日

我曾尝试将日、月和年的键作为字符串,但结果总是一样的,甚至有时很奇怪,就像上面的例子,我会在9月(9日)找到一个记录,但如果我转到4月f.ex。我有所有的记录


我不明白。这应该是非常直接的。

因为比赛从开始到结束,并在第一次机会时停止,所以您需要首先发出最重要的搜索条件。在原始查询中,您发出的日期早于月份,这将导致日期匹配,无论是哪一个月或哪一年

如果你相反

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, {}]

不是我的强大套件,但您不应该
emit([doc.client\u id,doc.year,doc.month,doc.day],doc)(即最重要的第一个)来进行比较?奇怪的是,与原始版本相比,所有天数都在1和32之间,因此在必须返回到月份之前,它们都会被包括在内(即1和32之间的所有天数,无论月份如何,都会被包括在内,因此所有匹配007的天数都会被包括在内)。使用新的emit,我看不出会发生什么。我会再尝试几次,你的建议在使用Firefox而不是chrome时似乎有效,我以前尝试过,但没有使用Firefox。我再次尝试了,现在可以了。把年放在第一位,月放在第二位,以日工结束。你能解释一下我的答案吗?谢谢。空哈希是非常有用的