sql >> データベース >  >> NoSQL >> MongoDB

mongodbジオロケーションクエリで$maxDistance引数としてオブジェクトプロパティを使用する

    このようにこれを行うことはできません。一般に、コレクション内の値に基づいてMongoDBクエリを作成することはできません。

    ただし、MongoDB 2.4以降、2dsphereという新しいインデックスがサポートされています。 これにより、ポイントだけでなくポリゴンもデータベースに保存できます。その情報を次のようなドキュメントに保存します:

    db.so.ensureIndex( { loc: '2dsphere' } );
    db.so.insert( {
        name: "Firestation 1",
        loc: {
            type: "Polygon",
            coordinates: [ [ [ 0, 0 ], [ 0, 1 ], [ 1, 1 ], [ 1, 0 ], [ 0, 0 ] ] ]
        }
    } );
    

    次に、「交差」クエリを使用して、ポイントが各ポリゴンでカバーされているかどうかを判断できます。

    db.so.find( {
        'loc' : {  
            $geoIntersects: { 
                $geometry: { type: 'Point', coordinates: [ 0, 0 ] } 
            } 
        }
    } );
    

    次に戻ります:

    { 
        "_id" : ObjectId("51f24d566775068ab0b786f0"), 
        "name" : "Firestation 1", 
        "loc" : { 
            "type" : "Polygon", 
            "coordinates" : [  [  [  0,  0 ],  [  0,  1 ],  [  1,  1 ],  [  1,  0 ],  [  0,  0 ] ] ] 
        } 
    }
    

    ここでは、0、0がポリゴンの中央にあるため、消防署が見つかります。ここでの秘訣は、もちろん、中心点から「半径」(たとえば10km)離れた円を構成するポリゴンポイントを計算することです。実際の円を取得することはできませんが、六角形または八角形で十分です。その計算は非常に単純ではありませんが、 http:// www.movable-type.co.uk/scripts/latlong.html#destPoint JavaScriptの例があります。0から2PIまでの8つのステップで方位をループして、円の円周に沿った点を計算し、それらを座標に配置するだけです。それらを二重にネストされた配列に埋め込み、最初と最後の配列を同じにするようにしてください:

    {
        name: "Firestation 1",
        loc: {
            type: "Polygon",
            coordinates: [ [
                [ point1-lon, point1-lat ], 
                [ point2-lon, point2-lat ], 
                [ point3-lon, point3-lat ], 
                ...
                [ point1-lon, point1-lat ], 
            ] ]
        }
    }
    



    1. mongodb $ in limit

    2. ClusterControl 1.7.1の発表:PostgreSQL11とMongoDB4.0のサポート、拡張モニタリング

    3. pysparkを使用してmongodbにデータフレームを保存する方法は?

    4. 更新/挿入にエラーがないか確認してください| MongoDBJavaドライバー