0

我对 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 日到 1 月 6 日。

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

我不明白这一点。这应该很简单。

4

1 回答 1

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, {}]
于 2013-07-31T16:08:16.267 回答