學習足跡

2013年9月18日 星期三

使用MongoDB做地理位置查詢(進階版)

在"使用MongoDB做地理位置查詢(簡易版)"一文中有提到,當我們在做LBS查詢時,還想要對資料做排序及分頁功能時,資料的結果會不符合我們的預期,因為當你在使用limit去做資料筆數的限制時,MongoDB 的作法撈取距離最近的筆數資料,撈出來後再做時間的排序,所以才會看到這樣的結果。

如果我們想要對LBS的查詢結果再去做子查詢,來達到資料分頁的效果,則需要使用 MongoDB 的 Aggregation 功能,Aggregation 可以針對上一查詢的結果,再去做另外的子查詢,所以 Aggregation 的順序是有差別的,盡可能好將能夠快速過濾資料的查詢語法放到最前方,這樣可以提升查詢時的效能。

但我們如果要使用 Aggregation 做地理位置查詢,則需要將該LBS 查詢放在 Aggregation 查詢的第一個位置才可以做 LBS 的查詢。




使用 Aggregation:$geoNear 做地理位置查詢


我們一樣使用"使用MongoDB做地理位置查詢(簡易版)"中的台北捷運車站做測試資料及建立索引

找捷運台北車站附近距離2公里內的捷運站




找捷運台北車站附近距離2公里內的捷運站、依照建立時間做排序


除了找出距離內的捷運車站資料,我們還希望依照資料建立的時間做排序



找捷運台北車站附近距離2公里內的捷運站、依照建立時間做排序、找前3筆資料


如果我們要將排序後的資料做分頁資料顯示的話,我們則會限制資料筆數



這裡你就會發現,使用 Aggregation 做地理位置筆數限制,就可以真的找出我們預期的資料了要


找捷運台北車站附近距離2公里內的捷運站、依照建立時間做排序、找第4、5、6筆的資料


如果你要找第二頁的資料(一頁為3筆資料),則可以使用$skip來指定要略過幾筆資料






參考資料




沒有留言:

張貼留言