我有一个名为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;
我做了很多谷歌搜索,但我似乎找不到一个好的教程 使用多个键。我的方法也是可能的 完全有缺陷,所以任何指导都会受到赞赏。
答案 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,两行代码都能正常工作。