2017-02-19 4 views
1

職場では、Node JS + Mongo DB(Mongoose)に基づいて位置情報アプリケーションを管理しています。私たちが必要としたジオロケーションの機能性は非常に単純で、既にMongoDB($ near、$ geoWithin、$ geoIntersect)で利用できました。私たちの主な問題はちょうど要件がありました。私たちは、保存された場所のいくつかの間の最善のルートを確認するために、「最短経路」機能を使用する必要がありました。mongoDB、ノードJSと最短パス関数、任意のオプションを利用できますか?

インターネットでの検索と検索では、mongoには最短パス機能がないようですが、このタスク(neo4jまたはpostgis)を実行するために2番目のデータベースを処理することをおすすめします。

質問は、mongoとノードだけで最短経路機能を実現する手頃な方法がありますか?または2番目のデータベースを扱う場合、何が最良の組み合わせになるか?

UPDATE

最近、私はモンゴDBヨーロッパ16で、モンゴDB 3.4で$ graphLookup機能を発見した最短経路を追跡するために有用であることができる方法についての協議を満たしています。これは現在、私が探しているものを達成するための適切な機能ですか?

答えて

0

最短パス計算を実行するmongodbにネイティブ演算はありません。

別のグラフデータストアの実装、保守、同期のコストを避けたい場合、グラフのサイズが非常に大きくない場合は、ノード、エッジ、および重み(または距離)をメモリにロードし、 JavaScriptの最短経路計算。

はあなたがすべてのエッジの重みを提供するグラフを初期化して path機能を呼び出すために必要なノードdijstraの資料によると node-dijkstra

ようなライブラリを使用することができ、自分自身を最短経路アルゴリズムを実装しないようにします。

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

関連する問題