學習足跡

2013年9月18日 星期三

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

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

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

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


PHP5.4安裝MongoDB PHP extension發生mongo: Unable to initialize module解決方法

最近在測試環境將PHP升級到5.4後,要照先前"在Ubuntu12.04安裝MongoDB及PHP extension"文章寫的步驟安裝 MongoDB PHP extension時,發現一直讀取不到 Mongo extension 的問題,查了一查才發現原來是安裝到PHP 5.3版的MongoDB extension Driver,所以才導致讀取不到Mongo extension 的狀況。

$ php -v
PHP startup mongo: Unable to initialize module
Module compiled with module API : 20090626
PHP compiled with module API : 20100525
These options need to match.

2013年9月17日 星期二

使用MongoDB做地理位置查詢(簡易版)

因為智慧型手機的普及,LBS(Location Based Service) 的服務在近期還算是蠻夯的服務,例如找附近的人,找附近的店家,找附近的大眾運輸工具...等等之類的在地化服務,若要將這類的服務資料查詢做在 MySQL ,對於資料庫來說是相當沉重的負擔,因為要服務的使用者每次位置座標皆不相同,所以要查詢的每個標的與使用者的距離也不相同,所以每次的查詢就要針對資料庫的的所有資料去做運算,或是限制要查詢資料的座標範圍以減少查詢計算的資料量,像是只找台北的標的資料,可是這樣的資料量還是相當龐大的,如果有 10 萬 筆資料要做查詢計算, 100 個 使用者做查詢就需要對 1000 萬筆(100 * 100000) 資料做查詢計算,這對於資料庫的運算是一個很大的負擔,而 MongoDB 有提供這類地理查詢的方法及優化。

使用 $near 做地理位置查詢

建立測試資料(以台北捷運為例)

我們在MongoDB建立捷運台北車站附近的捷運站座標資料,另外加入建立時間資料,我們會想要除了做地理位置搜尋,搜尋出來的資料還可以依照時間做排序。