我有一个名为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,两行代码都可以完美地工作。