2017-02-19 38 views
1

在工作中,我們正在維護基於Node JS + Mongo DB(Mongoose)的位置應用程序。我們需要的地理位置功能非常簡單,並且已經在MongoDB中可用($ near,$ geoWithin和$ geoIntersect)。我們的主要問題只是出現了一個要求,我們是否需要使用「最短路徑」功能來檢查我們存儲的一些位置之間的最佳路線。mongoDB,節點JS和最短路徑函數,可用的任何選項?

尋找在互聯網搜索,似乎蒙戈沒有最短路徑的功能和一些文章建議應對執行此任務(Neo4j的或PostGIS的)第二個數據庫。

的問題是,存在經濟實惠的方式來實現,只有蒙戈和節點的最短路徑的功能?或者如果處理第二個數據庫什麼可能是最好的組合?

UPDATE

最近我發現$ graphLookup功能在蒙戈DB 3.4,在蒙戈DB歐洲16見面瞭如何可以追蹤最短路徑有用的會談。這是目前正確的功能,以實現我在找什麼?

回答

0

有MongoDB中執行最短路徑計算沒有本機操作。

如果您想要避免實施,維護和同步獨立圖形數據存儲的成本,並且圖形的大小不是非常大,那麼您可以將節點,邊緣和權重(或距離)加載到內存中並執行javascript中的最短路徑計算。

爲了避免自己實現的最短路徑算法,可以使用這樣的庫如node-dijkstra

根據需要初始化圖形的每邊提供的權重,然後調用path功能節點dijstra文檔。

const Graph = require('node-dijkstra') 

const route = new Graph() 

route.addNode('A', { B:1 }) 
route.addNode('B', { A:1, C:2, D: 4 }) 
route.addNode('C', { B:2, D:1 }) 
route.addNode('D', { C:1, B:4 }) 

route.path('A', 'D') // => [ 'A', 'B', 'C', 'D' ] 
+0

感謝cjungel,其實這是可能的解決方案之一,主要的問題是,在許多情況下,節點的數量可能是廣泛的基於大型成千上萬的用戶可能會使用此功能只加載到內存中。 – dakairus

+0

@dakairus在這種情況下,我認爲你唯一的選擇是在你的架構中引入一個新的數據存儲。根據您的實時需求和數據量,您可以定期將圖表導入neo4j或其他grapth商店。然後,您可以使用neo4j進行實時最短路徑計算。如果您始終需要在計算中考慮最新數據,那麼我認爲您應該修改應用程序以使用neo4j存儲和查詢所有與圖形相關的操作。 – cjungel