查找时间范围与给定时间范围相交的文档
Finding documents with a time-range which intersect a given time-range
有一个文档列表 P
,有两个时间戳表示文档有效的时间范围 [ P ]
。创建了这些间隔的索引:
function (doc) {
emit([doc.start, doc.end], someStuff(doc));
}
我们想要接收文档 P
,在 结束时间戳 E
之前开始,在 开始时间戳 [=19] 之后停止=]:
P(S, E) = { P | P_s <= E && P_e >= S }
比如像这样的图片
<-- TIME -->
..------------------S-------------------------------------E----------------------..
.. P0 ][ P1 ][ P2 ][ P3 ][ P4 ][ P5 ][ P6 ..
我们期望子集 {P1, P2, P3, P4}
作为结果。我们尝试使用以下 key-range
获得所需的结果
_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
是否可以定义一个范围以便我们获得所需的结果?
使用 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
.
您几乎肯定也需要 "start" 上的 index 来加快速度。
有一个文档列表 P
,有两个时间戳表示文档有效的时间范围 [ P ]
。创建了这些间隔的索引:
function (doc) {
emit([doc.start, doc.end], someStuff(doc));
}
我们想要接收文档 P
,在 结束时间戳 E
之前开始,在 开始时间戳 [=19] 之后停止=]:
P(S, E) = { P | P_s <= E && P_e >= S }
比如像这样的图片
<-- TIME -->
..------------------S-------------------------------------E----------------------..
.. P0 ][ P1 ][ P2 ][ P3 ][ P4 ][ P5 ][ P6 ..
我们期望子集 {P1, P2, P3, P4}
作为结果。我们尝试使用以下 key-range
_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
是否可以定义一个范围以便我们获得所需的结果?
使用 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
.
您几乎肯定也需要 "start" 上的 index 来加快速度。