1

我们有一个 rethinkdb,里面有票。它们有一个 createdAt 时间戳(以毫秒为单位)和一个优先级属性。

例如

{
  createdAt: 12345,
  priority: 4,
  owner: "Bob",
  description: "test",
  status: "new"
}

rethinkdb.db('dev').table(tableId)
        .orderBy({index: 'createdAt'})
        .between(timeFrom,timeTo)
        .filter(filter)
        .skip(paginator).limit(20).run(this.connection);

我们现在有以下问题。我们想要一个执行两个 orderBy 的查询……第一个是 orderBy “priority”,也是 “createdAt”。因此,给定过滤器和时间跨度,它应该返回具有最高优先级的票证,并且在优先级内最旧的票证应该在最前面。

我们尝试建立一个具有优先级和 createdAt 的复合索引。这确实有效,但是 .between 没有按预期在该索引上工作。

rethinkdb.db('dev').table('tickets').indexCreate('prioAndCreatedAt' [rethinkdb.row('priority'), rethinkdb.row('createdAt')]).run(this.connection)

使用查询:

rethinkdb.db('dev').table(tableId)
        .orderBy({index: 'prioAndCreatedAt'})
        .between([rethinkdb.minval, timeFrom],[rethinkdb.maxval , timeTo])
        .filter(filter)
        .skip(paginator).limit(20).run(this.connection);

在我们看来,应该首先按优先级排序,然后按 createdAt 和 .between 进行排序,我们将忽略优先级(因为 .minval 和 .maxval),只获取 timeFrom 和 timeTo 之间的所有票证。

Buuuut 还返回了 createdAt 小于 timeFrom 的票证。所以这不像我们计划的那样工作。就像这样的“问题”:RethinkDB Compound Index Weirdness Using Between

但是我们想不出另一种方法来解决这个问题。

4

2 回答 2

0

自从

它应该返回具有最高优先级的票,并且在优先级内最旧的票应该在最前面

有理由不简单地使用 2orderBy吗?

r.db('dev').table('tickets')
  .between(timeFrom, timeTo, {index: 'createdAt'})
  .orderBy('createdAt')
  .orderBy(r.desc('priority'))

然后,您可以在此选择上使用您的过滤器/分页器。它将提供正确范围内的票证,按优先级降序排列,然后按创建日期升序排列(SQL 考虑的方式ORDER BY priority, createdAt)。它避免了复合索引的(记录的)行为。between

于 2018-08-25T23:30:36.597 回答
0

我认为您的查询仅在 createdAt 也是主键时才应该起作用。是吗?否则,您可以在 createdAt 字段上创建一个附加索引并在您的 between 语句中使用它:

r.db('dev').table('tickets').indexCreate('createdAt', r.row('createdAt'))

r.db...
.between([rethinkdb.minval, timeFrom],[rethinkdb.maxval , timeTo], {index:"createdAt"})

您还可以按照@Stock Overflaw 的描述使用多个 orderby,但只有将这两个条件放入一个 orderBy 语句中才能正常工作:

r.db('dev').table('tickets')
  .between(timeFrom, timeTo, {index: 'createdAt'})
  .orderBy(r.asc('createdAt'), r.asc('priority'))

请记住,这会降低性能,因为它不使用索引。

于 2018-09-04T14:11:35.337 回答