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

时间:2018-01-18 14:32:01

标签: couchdb

有一个文档列表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=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

是否可以定义范围以获得所需的结果?

1 个答案:

答案 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;也是为了加快速度。