gpt4 book ai didi

node.js - rethinkdb:如何按两个属性排序并在其中一个属性之间使用

转载 作者:太空宇宙 更新时间:2023-11-04 01:45:52 25 4
gpt4 key购买 nike

我们有一个 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

但我们无法找到其他方法。

最佳答案

自从

it should return the tickets with the highest priority and inside the priority the oldest should be on top

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

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

然后您可以通过管道将过滤器/分页器传递到此选择上。它将提供正确范围内的票证,按优先级降序排列,然后按创建日期升序排列(SQL 使用 ORDER BYpriority,createdAt 考虑的方式)。并且它避免了具有复合索引的 Between 的 ( documented ) 行为。

关于node.js - rethinkdb:如何按两个属性排序并在其中一个属性之间使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51527290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com