使用CouchDB进行高级日查询

时间:2013-07-31 13:41:17

标签: couchdb

我在Couch 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]

但是我没有从1月份的client_id = 007获取所有文件,而是获得与007匹配的所有记录。

所以必须有一些我误解的东西。我的查询有什么问题?怎么看?

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

我曾尝试将日,月,年的键作为字符串,但结果总是相同的,甚至有时候很奇怪,就像在上面的例子中一样,我会在九月(9)找到一条记录但是如果我去四月f.ex.我得到了所有记录。

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

1 个答案:

答案 0 :(得分: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, {}]