题
背后的问题 - 让我们说我的文档具有的 “类别”和时间戳的。如果我想在所有文档中的“富” 的有时间戳的最后两个小时内,这就是类,它很简单:
function (doc) {
emit([doc.category, doc.timestamp], null);
}
和然后查询作为
GET server:5894/.../myview?startKey=[foo, |now - 2 hours|]&endkey=[foo, |now|]
在问题出现时,我想在一些类别的富的或栏的,最后两个小时内。如果我不关心的时候,我可以直接通过按键集合键拉。不幸的是,我有范围没有这样的选项。
我最终什么事在此期间做的是四舍五入的时间戳两小时块,然后复用查询出来:
POST server:5894/.../myview
keys=[[foo, 0 hours], [foo, 2 hours], [bar, 0 hours], [bar, 2 hours]]
它的工作原理,但会变得混乱,如果我想将大量的时间回去(在关系块大小)。
有一种方法来发送多个startKey / endKey对向的视图,类似于键:[]数组可被发布为键
解决方案
有一个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 |一年|。等一个月
多重连接是一个不可扩展的开销我,我会寻求使2000同时:)(不,一个新的观点是不是一种选择 - 我们已经在400GB的数据加上一个视图)
其他提示
您可能会更好过只是做两个查询。 CouchDB的可处理多个同时的查询相当好,从而剥离几个进程/线程,查询foo和bar文档seperately。
CouchDB的当前不支持多个范围查询。或运算,并取与键是相当多的没有在一个查询中是可行的。
这已在CouchDB中的较新版本被添加。要添加开始/结束键的多个范围,您可以使用POST请求你的看法,有身体,看起来是这样的:
{
"queries": [
{ "startkey": 10, "endkey": 11 },
{ "startkey": 16, "endkey": 18 }
]
}
我知道这是一个老问题,但我最初发现它时,我一直在寻找的正是这种!