RethinkDB GetNearest 和多索引过滤
RethinkDB GetNearest and Filter for Multi-Index
是否可以查询与一个或多个标签匹配的附近点?
这是我拥有的数据:
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" }
}
如 中突出显示的那样,我可以使用 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
})
但我无法获得 (选项 #1)中建议的多索引(例如 membertags)的结果 - 使用 .filter({membertags : 'tag2'})
。
二级索引是使用 r.db("test").table("Member").index_create("membertags", multi=True)
创建的。我知道过滤器不支持二级索引,但找不到使用 getNearest 的替代解决方案。
如果你可以牺牲性能来使用 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')
})
我们现在使用 contains
来过滤 membertags
字段包含标签的结果,而不是使用 eq
。
缺点是 filter
不使用索引,因此性能可能不是很好。
是否可以查询与一个或多个标签匹配的附近点? 这是我拥有的数据:
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" }
}
如 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
})
但我无法获得 .filter({membertags : 'tag2'})
。
二级索引是使用 r.db("test").table("Member").index_create("membertags", multi=True)
创建的。我知道过滤器不支持二级索引,但找不到使用 getNearest 的替代解决方案。
如果你可以牺牲性能来使用 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')
})
我们现在使用 contains
来过滤 membertags
字段包含标签的结果,而不是使用 eq
。
缺点是 filter
不使用索引,因此性能可能不是很好。