2

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

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" }
}

如何在 RethinkDB 中对 getNearest() 查询运行过滤器中突出显示的那样?,我可以过滤 getNearest 使用eq

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 中的建议使用 filter 和 getNearest 命令(选项#1)获得多索引(例如成员标签)的结果 - 使用.filter({membertags : 'tag2'}).

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

4

1 回答 1

1

If you can sacrifice performance to use filter instead of index, we can do this:

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')
})

Instead of using eq we now use contains to filter the result in which membertags field contaisn the tag.

Downside is that filter doesn't use index so performance maybe not that great.

于 2015-11-11T17:33:47.897 回答