有一个文档列表P
,其中有两个时间戳,表示文档有效的时间范围[ P ]
。创建了这些间隔的索引:
function (doc) {
emit([doc.start, doc.end], someStuff(doc));
}
我们希望在某些结束时间戳P
之前收到文档E
,并在某些开始时间戳S
之后停止:
P(S, E) = { P | P_s <= E && P_e >= S }
例如,在像这样的图片中
<-- TIME -->
..------------------S-------------------------------------E----------------------..
.. P0 ][ P1 ][ P2 ][ P3 ][ P4 ][ P5 ][ P6 ..
我们期望子集{P1, P2, P3, P4}
作为结果。我们尝试使用以下键范围
_view/range?descending=false&startkey=[0,S]&endkey=[E,{}]
结果P(A, E) = {P0, P1, P2, P3, P4}
错误,在检查S=17
和E=30
的以下示例时有意义:
key startkey endkey accept
_________________________________________________________________________
[10,15] [0,17] <= [10,15] <= [30, {}] -> True <- This is wrong
[15,25] [0,17] <= [15,25] <= [30, {}] -> True OK
[25,30] [0,17] <= [25,30] <= [30, {}] -> True OK
[25,50] [0,17] <= [25,50] <= [30, {}] -> True OK
[35,50] [0,17] <= [35,50] <= [30, {}] -> False OK
是否可以定义范围以获得所需的结果?
答案 0 :(得分:1)
使用POST /db/_find端点更容易实现。您可以将查询表达为selector
:
{
"selector": {
"start": { "$lt": 100 },
"end": { "$gt": 300 }
}
"sort": ["start"]
}
这相当于SQL SELECT * FROM db WHERE start<100 AND end > 300 SORY BY start
。
你几乎肯定需要一个index开始&#34;开始&#34;也是为了加快速度。