10 萬
筆資料要做查詢計算, 100 個
使用者做查詢就需要對 1000 萬筆(100 * 100000)
資料做查詢計算,這對於資料庫的運算是一個很大的負擔,而 MongoDB 有提供這類地理查詢的方法及優化。使用 $near 做地理位置查詢
建立測試資料(以台北捷運為例)
我們在MongoDB建立捷運台北車站附近的捷運站座標資料,另外加入建立時間資料,我們會想要除了做地理位置搜尋,搜尋出來的資料還可以依照時間做排序。
查詢捷運台北車站附近的捷運站
找捷運台北車站附近距離2公里內的捷運站
這裡會列出距離台北車站2公里以內的所有捷運站資料,使用 $near 計算出來的距離單位為經緯度度數單位,我們要將單位換算成公里則需要除以
111.12
(6371公里(地球半徑)* 3.14 (圓周率) / 180(半圓度數) = 111.19492664456)
若需要將單位換成英里則需要除以
69.1
(3959英里(地球半徑)* 3.14 (圓周率) / 180(半圓度數) =69.097585086456)
找捷運台北車站附近距離2公里內的捷運站、依照建立時間做排序
除了找出距離內的捷運車站資料,我們還希望依照資料建立的時間做排序
找捷運台北車站附近距離2公里內的捷運站、依照建立時間做排序、找前3筆資料
如果我們要將排序後的資料做分頁資料顯示的話,我們則會限制資料筆數
在這裡你會發現,做資料筆數的限制撈出來的資料不是符合我們的預期的資料
因為當你在使用limit去做資料筆數的限制時,MongoDB 的作法撈取距離最近的筆數資料,撈出來後再做時間的排序,所以才會看到這樣的結果。
備註
MongoDB 可以對查詢的結果再做子查詢,我有試著先撈出距離2公里內,且依照時間排序後的資料,然後再對其做資料筆數限制的子查詢,可是結果與上述相同:
如果要使用 MongoDB 做 LBS 查詢時,也能正確的對資料做排序及分頁,可以再參考"使用MongoDB做地理位置查詢(進階版)"一文的說明。
沒有留言:
張貼留言