Couchdb视图按日期筛选



我有一个名为Order structure的简单文档,userId和timeScheduled。

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

我的观点:

"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]以执行ifdoc.userId==key[1]或类似的东西,然后在时间

这相当于的SQL

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

我在谷歌上搜索了好几次,但似乎找不到好的教程关于使用多个键。也有可能我的方法是完全有缺陷,因此任何指导都将不胜感激。

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

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,所以不需要重复它

别忘了设置一个endkey=["f98ba9a518650a6c15c566fc6f00c157",{}],否则你会得到所有用户的数据>"f98ba 9a518650 a6c566fc6f 00c157"

答案实际上来自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,两行代码都可以完美地工作。

相关内容

  • 没有找到相关文章

最新更新