潜在问题 - 假设我的文档有“类别”和时间戳。如果我希望“foo”类别中的所有文档的时间戳都在过去两小时内,那很简单:
function (doc) {
emit([doc.category, doc.timestamp], null);
}
然后查询为
GET server:5894/.../myview?startKey=[foo, |now - 2 hours|]&endkey=[foo, |now|]
在过去两小时内,当我想要类别 foo 或 bar 中的某些内容时,问题就出现了。如果我不关心时间,我可以通过按键集合直接按键。不幸的是,我对范围没有这样的选择。
我在此期间最终做的是将时间戳四舍五入为两小时的块,然后将查询多路复用:
POST server:5894/.../myview
keys=[[foo, 0 hours], [foo, 2 hours], [bar, 0 hours], [bar, 2 hours]]
它可以工作,但是如果我想要回去大量的时间(与块大小相关)会变得混乱。
有没有办法将多个startKey / endKey对发送到一个视图,类似于key:[]可以发布密钥的数组?
答案 0 :(得分:9)
有一个CouchDB问题请求让你这样做。我已经在0.10.1上添加了一个简单的,无保证的补丁,可能对你有用。它对我有用,让我做一些事情:
{
"keys": [
{
"startkey": ["0240286524","2010","03","01"],
"endkey": ["0240286524","2010","03","07",{}]
},
{
"startkey": ["0442257276","2010","03","01"],
"endkey": ["0442257276","2010","03","07",{}]
}
]
}
POST主体中的,它允许我在一系列日期中获取多个跟踪ID的所有数据。我与group=true&group_level=1
通话,将结果按跟踪ID分组。更深的组级别允许我通过跟踪id |年,跟踪id | year | month等进行分组。
对于我来说,多个连接是一个不可扩展的开销,因为我希望同时创建2000 :)(不,新视图不是一个选项 - 我们已经为400GB数据加上一个视图!)
答案 1 :(得分:4)
你可能最好只做两个查询。 CouchDB可以很好地处理多个同时查询,因此可以分离几个进程/线程并单独查询foo和bar文档。
CouchDB目前不支持多个范围查询。在一个查询中,ORing和ANDing键几乎不可行。
答案 2 :(得分:4)
这已在较新版本的CouchDB中添加。要添加多个范围的开始/结束键,您可以对视图使用POST请求,其主体看起来像这样:
{
"queries": [
{ "startkey": 10, "endkey": 11 },
{ "startkey": 16, "endkey": 18 }
]
}
我知道这是一个古老的问题,但我最初是在寻找这个问题时找到的!