RethinkDB GetNearest和Filter for Multi-Index

时间:2015-11-11 09:14:12

标签: javascript rethinkdb reql

是否可以查询与一个或多个标签匹配的附近点? 这是我的数据:

r.db("test").table("Member"):

{ "POSTALCODE":  "526494" ,
"lat":  "1.3640" , "lon":  "103.9531" ,
"memberId":  "22b99a77-5f73-4331-a5da-dcdc46a4b4e7" ,
"membertags": ["tag1" ,"tag2" , "tag3" ] ,
"point": { "$reql_type$":  "GEOMETRY" , "coordinates": [103.9531 ,1.364],"type":  "Point"}
} {
"POSTALCODE":  "525842" ,
"lat":  "1.3516" , "lon":  "103.9384" ,
"memberId":  "79844285-7781-4bd4-819e-db54f90b8c8d" ,
"membertags": ["tag2" ,"tag3" ,"tag4" ,"tag5"] ,
"point": {"$reql_type$":  "GEOMETRY" ,"coordinates": [103.9384 ,1.3516] ,"type":  "Point" }
}

正如How do I run a filter on a getNearest() query in RethinkDB?中所强调的,我可以使用eq

过滤getNearest
var point = r.point(103.9531,1.364);  
r.db('test')
.table('Member')
.getNearest(point, {index: 'point', unit :'km'})
.filter(function(user) {
   return user('doc')('POSTALCODE').eq('525842') //1 RESULT
   //return user('doc')('membertags').eq('tag2') //EMPTY RESULT
})

但我无法按照rethinkdb with filter and getNearest commands(选项#1)中的建议 - 使用.filter({membertags : 'tag2'})获得多索引(例如membertags)的结果。

二级索引是使用r.db("test").table("Member").index_create("membertags", multi=True)创建的。我知道过滤器不支持二级索引,但找不到使用getNearest的替代解决方案。

1 个答案:

答案 0 :(得分:1)

如果您可以牺牲性能来使用filter而不是索引,我们可以这样做:

var point = r.point(103.9531,1.364);  
r.db('test')
.table('Member')
.getNearest(point, {index: 'point', unit :'km'})
.filter(function(user) {
  return user('doc')('membertags').contains('tag2')
})

我们现在使用eq来过滤contains字段包含标记的结果,而不是使用membertags

缺点是filter不使用索引,因此性能可能不那么好。