【问题标题】:rethinkdb with filter and getNearest commandsrethinkdb 使用 filter 和 getNearest 命令
【发布时间】:2015-06-26 04:14:39
【问题描述】:

如何执行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

【问题讨论】:

  • 我真的不明白你在问什么。你能更具体一点吗?您现在的查询似乎是正确的,假设 users 表中的每个文档都有一个 geodata 字段,它是一个地理空间二级索引。这有帮助吗?你遇到了什么样的问题?
  • 我有一个 'users' 表:[ {id: 1, tags : ['music', 'cups'], geodata: r.point()} {id: 2, tags: [ 'music', 'play'], geodata: r.point()} ] 首先我想按 'tags' 字段过滤,然后返回最近的。我指定的查询不正确,返回如下错误:“RqlRuntimeError: Expected type TABLE but found SELECTION”
  • 现在我看到了问题所在。在下面添加了解决方案!

标签: nearest-neighbor rethinkdb


【解决方案1】:

您的查询引发错误的原因是因为.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 方法随时获取anything 的类型。

例子:

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

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

如果您想了解更多关于 ReQL 数据类型的信息,可以查看我写的 blog post,它解释了 ReQL 数据类型以及它们之间的区别。

【讨论】:

  • 您的解决方案存在两个问题。 1. 为了确保结果,我必须删除 getNearest 中的“maxResults”限制。 2. 如果我删除“maxResults”限制,查询可能会非常慢,因为过滤器命令不适用于索引。
  • 我 100% 意识到这一点。我使用getAllorderBy 添加了另一种可能的方法。
  • 为了清楚起见,您在数据库中遇到了当前限制。这是我们在 RethinkDB 正在做的事情。一个可能的解决方案是地理空间复合索引:github.com/rethinkdb/rethinkdb/issues/2855
猜你喜欢
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-27
  • 2016-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多