rethinkdb:如何通过两个属性进行排序,并在其中一个属性之间使用

问题描述 投票:1回答:2

我们有一个带有票据的rethinkdb。它们的createdAt具有以毫秒为单位的时间戳和优先级属性。

EG

{
  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);

我们现在有以下问题。我们想要一个执行两个ord​​erBy的查询...第一个是orderBy“priority”,也是“createdAt”。因此,考虑到过滤器和时间跨度,它应该返回具有最高优先级的票证,并且在优先级内,最老的应该在最顶层。

我们尝试构建具有优先级和createdAt的复合索引。这确实有效,但是。之间没有按照预期在这个指数上运作。

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和。之间排序,我们将忽略优先级(因为.minval和.maxval),并且只需获取timeFrom和timeTo之间的所有票证。

Buuuut也是在返回时创建小于timeFrom的门票。所以这不像我们计划的那样有效。就像这个“问题”:RethinkDB Compound Index Weirdness Using Between

但我们无法找到另一种方法。

node.js database rethinkdb rethinkdb-javascript reql
2个回答
0
投票

以来

它应该返回具有最高优先级的票证,并且在优先级内最老的应该在顶部

有没有理由不简单地使用2 orderBy

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

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


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'))

请记住,这不太合适,因为它不使用索引。

© www.soinside.com 2019 - 2024. All rights reserved.