2017-02-19 41 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