查找时间范围与给定时间范围相交的文档

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=17E=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 来加快速度。