2017-04-11 174 views
6

我正在使用Firebase以最後一次掃描的經度和緯度存儲用戶。查詢附近位置

的條目是這樣的:

"Bdhwu37Jdmd28DmenHahd221" : { 
    "country_code" : "at", 
    "firstname" : "John", 
    "gender" : "m", 
    "lat" : 11.2549387, 
    "lon" : 17.3419559 
} 

當用戶按下特定的「搜索」按鈕,我希望我的火力地堡的功能,以獲取人們最接近誰發送請求的人。

由於Firebase僅允許在一個字段後查詢,因此我決定添加country_code,以便對該字段有一些範圍限制和查詢。但是,當我加載特定國家的每個用戶時,它仍然超級慢,然後檢查給定用戶和同一個國家中的所有其他用戶之間的最小距離。

已經有5個用戶,該功能需要40秒才能實現結果。

我也讀過關於複合索引,但我需要以某種方式結合緯度和經度和兩個領域的查詢。

是否有任何方法可以獲得第二個和第三個查詢(例如搜索相同的country_code,然後是類似的經度和緯度),還是必須在我的服務器代碼中解決這個問題?

+4

https://github.com/firebase/geofire – cartant

回答

12

Firebase數據庫只能通過單個屬性進行查詢。因此,對經度和緯度值進行過濾的方法是將它們組合成一個屬性。該組合屬性必須保留數字值所需的篩選特徵,例如篩選範圍的功能。

雖然這看起來不可能,但實際上它已經以Geohashes的形式完成。幾個其性狀:

  1. 它是一種分層的空間數據結構,其細分空間分隔成格子狀

所以水桶:Geohashes劃分空間到存儲桶的網格,每個桶由一個字符串標識。

  • Geohashes提供像任意精度和逐漸從代碼的末尾去除字符以減小其尺寸(和逐漸失去精度)的可能性的特性。

  • 越長串,更大的剷鬥覆蓋

  • 隨着逐漸精度劣化的結果,附近的地方將所述區域通常(但不總是)呈現類似的前綴。共享前綴越長,兩個地方越接近。

  • 字符串開始以相同字符是彼此接近的。

    結合這些特質,您可以看到爲什麼這些Geohashes與Firebase數據庫一起使用時非常有吸引力:它們將位置的經度和緯度組合成單個字符串,其中按字典順序彼此靠近的字符串指向位置那些物理上彼此接近。魔法!

    Firebase提供了一個名爲Geofire的庫,該庫使用Geohashes在其實時數據庫之上實現Geolocation系統。該庫可用於JavaScriptJavaObjective-C/Swift

    要了解更多關於Geofire,請上網:

    +0

    謝謝,我會閱讀並嘗試此操作。有可能,雲功能超級慢嗎?每次只查詢3人需要40秒(不僅是第一次),我只能訪問2個數據庫。 – Thomas

    +0

    如果您始終如一地表現出您認爲不合理的表現(即使您認爲雲端函數處於測試階段),請使用[重現此問題的最低代碼]打開一個問題(http://stackoverflow.com/help/mcve) 。 –

    +0

    GeoFire工作正常,但當用戶的位置嵌套在用戶數據中時,我無法使其工作。我的geoFire參考點位於「/ user」,我的geoFire數據位於/ user/$ uid /位置,geoFire會自動搜索嵌套字段,還是必須在某處找到「g」值?它看起來像算法直接在我的「/用戶」條目下尋找「g」,而不是「位置」 – Thomas