您的查询抛出错误的原因是.getNearest http://rethinkdb.com/api/javascript/get_nearest/仅适用于表格。文档就是这么说的。
选项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
增量直到获得所需的所有结果,但这可能很复杂而且不太优雅。
Option 2
如果过滤器要过滤掉大部分结果,那么您可以使用以下方式过滤结果getAll http://rethinkdb.com/api/javascript/get_all/(创建一个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 http://rethinkdb.com/api/javascript/type_of/方法。
例子:
r.db('test')
.table('users').typeOf() // "TABLE"
r.db('test')
.table('users')
.filter({tags : 'tag'}).typeOf() // "STREAM"
如果你想了解更多关于ReQL数据类型的信息,你可以看看这个博客文章 http://blog.hiphipjorge.com/data-types-in-rethinkdb-whats-the-difference/我写了一篇文章,解释了 ReQL 数据类型以及它们的不同之处。