多个键范围作为CouchDB视图的参数

时间:2009-09-23 21:44:10

标签: couchdb

潜在问题 - 假设我的文档有“类别”时间戳。如果我希望“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:[]可以发布密钥的数组?

3 个答案:

答案 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数据加上一个视图!)

问题和补丁位于https://issues.apache.org/jira/browse/COUCHDB-523

答案 1 :(得分:4)

你可能最好只做两个查询。 CouchDB可以很好地处理多个同时查询,因此可以分离几个进程/线程并单独查询foo和bar文档。

CouchDB目前不支持多个范围查询。在一个查询中,ORing和ANDing键几乎不可行。

答案 2 :(得分:4)

这已在较新版本的CouchDB中添加。要添加多个范围的开始/结束键,您可以对视图使用POST请求,其主体看起来像这样:

{
  "queries": [
    { "startkey": 10, "endkey": 11 },
    { "startkey": 16, "endkey": 18 }
  ]
}

我知道这是一个古老的问题,但我最初是在寻找这个问题时找到的!