Couchdb视图按日期过滤

时间:2012-02-13 18:56:09

标签: views couchdb mapreduce

我有一个名为Order结构的简单文档,其中包含字段id,name, userId和timeScheduled。

我想做的是创建一个我可以找到的视图 对于那些userId是某些值和timeScheduledis的人来说,document.id 在给定日期之后。

我的观点:

"by_users_after_time": {
      "map": "function(doc) { if (doc.userId && doc.timeScheduled) {
emit([doc.timeScheduled, doc.userId], doc._id); }}"
  }

如果我这样做

localhost:5984/orders/_design/Order/_view/by_users_after_time?startKey="[2012-01-01T11:40:52.280Z,f98ba9a518650a6c15c566fc6f00c157]"

我得到了所有结果。有没有办法访问键[1]来执行if doc.userId == key [1]或沿着那些行的东西,然后简单地发出 时间?

这将是

的SQL等价物
select id from Order where userId =
"f98ba9a518650a6c15c566fc6f00c157" and timeScheduled >
2012-01-01T11:40:52.280Z;

我做了很多谷歌搜索,但我似乎找不到一个好的教程 使用多个键。我的方法也是可能的 完全有缺陷,所以任何指导都会受到赞赏。

3 个答案:

答案 0 :(得分:1)

您只需要反转密钥,因为用户名已知:

function (doc) {
  if (doc.userId && doc.timeScheduled) {
    emit([doc.userId, doc.timeScheduled], 1);
  }
}

然后查询:

?startkey=["f98ba9a518650a6c15c566fc6f00c157","2012-01-01T11:40:52.280Z"]

注意:

  • 查询参数为startkey,而非startKey;
  • startkey的值是一个数组,而不是一个字符串。然后双引号围绕用户名和日期值,而不是数组周围。
  • 我将1作为值而不是doc._id发出,以节省磁盘空间。结果的每一行都有一个id字段和doc._id,然后就不需要重复了。

答案 1 :(得分:1)

不要忘记设置一个endkey = [“f98ba9a518650a6c15c566fc6f00c157”,{}],否则你得到所有用户的数据> “f98ba9a518650a6c15c566fc6f00c157”

答案 2 :(得分:0)

答案实际上来自couchdb邮件列表:

基本上,Date.parse()不喜欢时间戳上的+0000。通过 做一个子串并删除+0000,一切正常。

记录,

document.write(new Date("2012-02-13T16:18:19.565+0000")); //Outputs Invalid
Date
document.write(Date.parse("2012-02-13T16:18:19.565+0000")); //Outputs NaN

但如果删除+0000,两行代码都能正常工作。