MongoDB の地理空間機能を実装する方法

Mongodb No De Li Kong Jian Ji Nengwo Shi Zhuangsuru Fang Fa



MongoDB の地理空間機能は、地理データをデータベースに保存する簡単な方法を提供します。基本的に、地理空間データは GeoJSON オブジェクトとして MongoDB に保存できます。 GeoJSON は、単純な地理データを含む JavaScript Object Notation に依存する無料のオープンソース形式です。この機能は、位置検索に基づくマッピング プロセスなど、位置に基づくサービスを必要とするアプリにとって重要です。この記事では、実装例を使用して地理空間機能について説明します。

地理空間フィーチャのコレクションへのドキュメントの追加

MongoDB 地理空間機能の機能を実証するには、特定のコレクションのドキュメントが必要です。以下に示すように、いくつかのドキュメントを「エリア」コレクションに挿入します。

db.area.insertMany( [
{
名前: 「こどもパーク」
場所: { タイプ: 'ポイント' 、座標: [ - 60.97 30.77 ] },
カテゴリー: '庭'
}、
{
名前: 「学生エリア」
場所: { タイプ: 'ポイント' 、座標: [ - 60.9928 30.7193 ] },
カテゴリー: '庭'
}、
{
名前: 「フットボールグラウンド」
場所: { タイプ: 'ポイント' 、座標: [ - 60.9375 30.8303 ] },
カテゴリー: 'スタジアム'
}
])

座標などの位置データを含むドキュメントがあります。さらに、フィールドに地理空間インデックスを作成して、地理空間クエリのパフォーマンスを最適化します。









例 1: $geoIntersects クエリ演算子の使用

まず、指定されたオブジェクトと交差する地理空間フィーチャの $geoIntersects 演算子があります。 $geoIntersects 演算子の次の実装を考えてみましょう。



db.area.find({ location: { $geoIntersects: { $geometry: { type: 'ポイント'

座標: [ - 60.97 30.77 ] } } } })

この例では、「find」操作とともに「area」コレクションを呼び出します。 find() メソッドに、「場所」フィールド セットを地理空間フィーチャの $geoIntersects クエリ演算子に渡します。これは、指定された点がジオメトリ フィールドに保存されているジオメトリと交差するかどうかを確認するために使用されます。





次に、$geoIntesects オペレーターは、タイプ フィールドに「Point」値が設定され、座標フィールドに「座標」値が与えられる $geometry オペレーターを受け取ります。ここでは、$geometry が地理空間比較用に定義されています。

次の出力は、予期されるドキュメントが取得される場所と、指定された点と交差する幾何学オブジェクトがジオメトリ フィールドに含まれる場所です。



例 2: $near クエリ演算子の使用

$near 演算子は、特定の場所に地理的に近いドキュメントを識別する地理空間クエリを実行するために使用される地理空間機能でもあります。指定された場所への近さに従って配置されたドキュメントを取得します。ここでは、$near 演算子の実装を提供します。

db.area.find(
{
位置:
{ $near :
{
$geometry: { タイプ: 'ポイント' 、座標: [ - 60.9667 30.78 ] },
$minDistance: 1000
$maxDistance: 5000
}
}
}

この例では、「find」操作内で「area」コレクションの「location」フィールドを定義します。次に、地理空間フィーチャの $near クエリ演算子をその「場所」フィールドに設定します。 $near 演算子は、指定された座標点で近い点を検索します。次に、特定の値が指定された $near 演算子の $minDistance パラメーターと $maxDistance パラメーターを使用して、指定された点から指定された距離範囲内にあるドキュメントを取得します。

ドキュメントは、地理空間「エリア」コレクション内の指定された場所または対象地点の近くにある出力で取得されます。

例 3: $nearsphere クエリ演算子の使用

あるいは、$near 演算子に似た $nearsphere 演算子がありますが、$nearSphere は距離を計算するときに地球の球形を考慮します。

db.area.find(
{
位置: {
$nearSphere: {
$ジオメトリ: {
タイプ : 'ポイント'
座標: [ - 60.9667 30.78
}、
$minDistance: 1000
$maxDistance: 5000
}
}
}

この例では、地理空間クエリの $nearsphere 演算子を使用します。ここでの $nearspehere 演算子は、最近接点がクエリで指定された点に近いドキュメントを検索し、その点が座標フィールド配列に設定されます。

その後、$minDistance パラメーターと $maxDistance パラメーターを設定して結果を調整します。 $minDistance パラメーターは、返されるドキュメントが指定されたポイントから少なくとも 1000 メートル離れていることを保証します。一方、$maxDistance パラメーターは、結果を 5000 メートル以内の場所に制限します。

ドキュメントは、指定された座標の点から指定されたメートル以内の位置で出力に表示されます。

例 4: $geoWithin クエリ演算子の使用

次に、MongoDB には $geoWithin オペレーターがあり、これは円などの指定された形状内に完全に収まるドキュメントを見つけるための地理空間クエリに使用されます。次の $geoWithin クエリのデモを見てみましょう。

db.area.find({ 場所:

{ $geoWithin:

{ $centerSphere: [ [ - 60.93414657 30.82302903 ]、 3 / 3963.2 ] } } })

この例では、$geoWithin オペレーターを使用して、2D 球上の特定の円形エリア内の「エリア」コレクションのドキュメントを検索します。このため、$geoWithin 演算子内に $centerSphere 演算子を指定します。これは、ここでの座標点を表す中心点と、マイル単位の距離値を表す円の半径として 2 つの引数を取ります。

結果として得られるドキュメントは、次のように取得されます。これは、指定された中心点と半径約 3 マイルによって定義される円内にある地理空間点を表します。

例 5: $geoNear クエリ演算子の使用

さらに、$geoNear オペレーターは、集約パイプラインに使用される地理空間オペレーターでもあります。地理空間クエリを実行し、指定された地点への近さによって並べ替えられたドキュメントを返します。ここでは、集計パイプライン内で呼び出される $geoNear オペレーターを指定しました。

db.area.aggregate([
{
$geoNear: {
近く: { タイプ: 'ポイント' 、座標: [ - 60.99279 30.719296 ] },
距離フィールド: 「距離計算済み」
最大距離: 2
クエリ: { カテゴリ: '庭' }、
includeLocs: 「距離の位置」
球面: 真
}
}
])

この例では、MongoDB の集約メソッドを呼び出し、その中に $geoNear 演算子を定義します。 $geoNear 演算子には、クエリの動作を指定するためのいくつかのパラメーターが設定されます。まず、検索の基準点となる「座標」値を提供する「near」パラメータを設定します。

次に、「 distanceField 」パラメーターを使用して、提供されたフィールドを結果フィールドとして指定します。このセット結果フィールドには、各ドキュメントと参照点の間の距離が格納されます。次に、最大距離をメートル単位で表す値「2」を使用して「maxDistance」パラメータを定義します。

その後、「カテゴリ」フィールドでドキュメントをフィルタリングし、「カテゴリ」が「公園」であるドキュメントのみを考慮する「クエリ」パラメータがあります。次に、「includeLocs」パラメータを呼び出して位置情報を含めます。最後に、2D 球面座標系を使用して距離を計算する「true」値を使用して「球面」パラメーターを指定します。

集約パイプラインは、パラメーターに応じた情報を表示する出力内のドキュメントを表します。次の「dist.calculated」フィールドには、参照点からの各ドキュメントの距離が表示されます。

結論

MongoDB の地理空間機能が、位置ベースの情報を効率的に処理し、クエリするのに役立つことがわかりました。サンプル プログラムで、さまざまな演算子を使用した地理空間機能の実装を学びました。幅広い用途に役立つ機能やメソッドが他にも多数あります。