Javascript 针对多索引重新定义DB GetNearest和筛选器

Javascript 针对多索引重新定义DB GetNearest和筛选器,javascript,rethinkdb,reql,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

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

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')
获得(选项#1)中建议的多索引(例如membertags)的结果


二级索引是使用
r.db(“test”).table(“Member”).index\u create(“membertags”,multi=True)
创建的。我知道过滤器不支持二级索引,但无法找到使用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')('membertags').contains('tag2')
})
我们不再使用
eq
而是使用
contains
来过滤
membertags
字段包含标记的结果


缺点是
过滤器不使用索引,所以性能可能不太好。

谢谢我现在可以使用
returnuser('doc')('membertags')。contains(函数(tag){return tag.eq('tag1')。或(tag.eq('tag2');})
(code:)将其扩展为与任何一个标记匹配,但这对
条件不起作用(即返回每个匹配>1个标记的记录)。我在这里遗漏了什么吗?
将始终返回false,因为单个标记一次不能等于两个值。在谓词函数中,每次都将数组的一个元素传递到谓词函数中。因此,您不能将其与
一起使用。检查这一点的一种方法是使用
setcrossion
如下:
filter(函数(用户){return user('doc')('membertags')).setcrossion(['tag2','tag4']).count().eq(2)}
setcrossion返回值出现在两个数组中,然后计算结果数组的大小