带有过滤器和 getNearest 命令的 rethinkdb
rethinkdb with filter and getNearest commands
如何执行 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'})
我有一个 'users' table:
[
{id: 1, tags : ['music', 'cups'], geodata: r.point()}
{id: 2, tags: ['music', 'play'], geodata: r.point()}
]
首先,我想按 'tags' 字段进行过滤,然后 return 最近的字段。
我指定的查询不正确,return 出现以下错误:“RqlRuntimeError: 预期类型 TABLE 但找到 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
returns 数组和 .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 数据类型及其不同之处。
如何执行 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'})
我有一个 'users' table:
[
{id: 1, tags : ['music', 'cups'], geodata: r.point()}
{id: 2, tags: ['music', 'play'], geodata: r.point()}
]
首先,我想按 'tags' 字段进行过滤,然后 return 最近的字段。
我指定的查询不正确,return 出现以下错误:“RqlRuntimeError: 预期类型 TABLE 但找到 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
returns 数组和 .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 数据类型及其不同之处。