gpt4 book ai didi

nearest-neighbor - 带有过滤器和 getNearest 命令的 rethinkdb

转载 作者:行者123 更新时间:2023-12-04 07:23:29 24 4
gpt4 key购买 nike

如何执行 getNearest 查询其他命令的结果,例如过滤器命令?

var point = r.point(-122.422876,37.777128);  
r.db('test').table('users').
filter({tags : 'tag'}).
getNearest(point, {index: 'geodata', maxResults: 30, unit :'km'})

我有一个“用户”表:

 [ 
{id: 1, tags : ['music', 'cups'], geodata: r.point()}
{id: 2, tags: ['music', 'play'], geodata: r.point()}
]

首先,我想按“标签”字段进行过滤,然后返回最近的。

我指定的查询不正确,返回以下错误:“RqlRuntimeError: Expected type TABLE but found SELECTION

最佳答案

你的查询抛出错误的原因是因为 .getNearest仅适用于表格。文档就是这么说的。

选项#1

你可以通过颠倒命令的顺序来解决你的问题:

var point = r.point(-122.422876,37.777128);  
r.db('test')
.table('users')
.getNearest(point, {index: 'geodata', maxResults: 30, unit :'km'})
.filter({tags : 'tag'})

这是有效的,因为 .getNearest 返回一个数组,而 .filter 可以处理一个数组。

var point = r.point(-122.422876,37.777128);  
r.db('test')
.table('users')
.getNearest(point, {index: 'geodata', unit :'km'})
.filter({tags : 'tag'})
.limit(30)

这种方法的问题是,为了保证所有可能的结果都存在,你不能将 maxResults 选项传递给 getNearest,这意味着每一行都将被查询然后过滤.

这种情况最适用于大多数项目将通过过滤器的情况。

根据您的数据,也可以编写一个递增增加 maxResults 的函数,直到它获得所需的所有结果,但这可能很复杂而且不是很优雅。

选项 2

如果过滤器要过滤掉大部分结果,那么您可以使用 getAll 过滤结果(创建一个 tags 索引)并让 getAll 先过滤结果,然后根据距离对结果进行排序:

var point = r.point(-122.422876,37.777128);
r.table('users')
.getAll('tag', {index: 'tags'})
.orderBy(r.row('geodata')
.distance(point))
.limit(30)

数据类型

通过使用 .typeOf,您始终可以随时获取任何内容的类型方法。

示例:

r.db('test')
.table('users').typeOf() // "TABLE"

r.db('test')
.table('users')
.filter({tags : 'tag'}).typeOf() // "STREAM"

如果您想了解更多有关 ReQL 数据类型的信息,可以查看此 blog post我写了解释 ReQL 数据类型及其不同之处的文章。

关于nearest-neighbor - 带有过滤器和 getNearest 命令的 rethinkdb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29730916/

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