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


潜在的问题 - 让我说我的文件有 “类别” 和 时间戳。如果我想要的所有文件 “富” 时间戳在过去两小时内的类别,很简单:

function (doc) {
  emit([doc.category, doc.timestamp], null);
}

然后查询为

GET server:5894/.../myview?startKey=[foo, |now - 2 hours|]&endkey=[foo, |now|]

当我想要类别的东西时,问题就出现了 FOO 要么 酒吧,在最后两个小时内。如果我不关心时间,我可以通过按键集合直接按键。不幸的是,我对范围没有这样的选择。

在此期间我最终做的是将时间戳四舍五入到两小时的块,然后将查询多路复用:

POST server:5894/.../myview
keys=[[foo, 0 hours], [foo, 2 hours], [bar, 0 hours], [bar, 2 hours]]

它可以工作,但是如果我想要回去大量的时间(与块大小的关系)会变得混乱。

有没有办法将多个startKey / endKey对发送到视图,类似于键:[]数组可以发布键?


2580
2017-09-23 21:44


起源



答案:


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

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


4
2017-09-24 03:13



你可以通过钥匙贴OR键,但是是的。谢谢。 - kolosy


答案:


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

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


4
2017-09-24 03:13



你可以通过钥匙贴OR键,但是是的。谢谢。 - kolosy


有一个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 。


9
2018-03-24 00:11





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

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

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


3
2018-03-21 17:20



任何文档引用? - Isaac
还没有,我已经答应修补文档,因为我们还没有它们!如果另一个例子有用的话,我确实写了博客 lornajane.net/posts/2017/multiple-search-keys-in-couchdb - Lorna Mitchell
啊,我发现API文档已经存在,它们在这里: docs.couchdb.org/en/2.0.0/api/ddoc/... - Lorna Mitchell
呃,这不是OP真正的问题吗?我理解的目标不是启动一个查询,该查询从两个范围的并集中选择具有(一维)键的记录,而是选择那些具有两个维度在一定范围内的多维键的记录。您可以将其想象为2D空间数据的索引,您希望在该数据上启动查询以查找范围为[x0,x1]且y在[y0,y1]中的x的点,就像查询四叉树一样。在OP的帖子中,x0 = x1 =“foo”,y0 = now-2h,y1 = now。 - Warkst
这是如何实现OP所要求的。 CouchDB只能在视图中进行连续的值范围过滤(即按视图键排序)。如果您想要的结果在视图输出中不是彼此相邻,则需要使用我概述的方法获取多个范围。希望能让它更清晰! - Lorna Mitchell