2015-11-11 61 views
2

是否可以查詢與一個或多個標籤匹配的附近點? 這是我擁有的數據:RethinkDB GetNearest和多索引篩選器

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

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

過濾getNearest但我不能得到多指標的結果(例如membertags)作爲建議在rethinkdb with filter and getNearest commands(選項#1) - 使用.filter({membertags : 'tag2'})

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

回答

0

如果你可以犧牲性能,使用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場contaisn的標籤。

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

+0

謝謝! - 我現在可以使用'return user'('doc')('membertags')擴展它與任一標籤匹配。contains(function(tag){return tag.eq('tag1')。或者(tag.eq('但是這對'.and'條件不起作用(即返回每個匹配> 1個標籤的記錄)。我在這裏想念什麼? – totoro

+1

'和'將始終返回false,因爲一次一個標籤不能等於兩個值。在謂詞函數內部,每次數組的一個元素都被傳入謂詞函數。因此你不能用'和'來使用它。檢查這一點的一種方法是使用'setIntersection'就像這樣:'filter(function(user){return'user'''''('membertags').setIntersection(['tag2','tag4'])。count ().eq(2) })'setIntersection返回值出現在兩個數組中,然後計算結果數組的大小 – kureikain