1

値が一定でない $maxDistance 引数を持つ $near クエリを書きたいと思います。たとえば、場所とカバレッジ半径を持つ消防署のコレクションがあり、カバレッジ半径に特定のポイントが含まれるすべての消防署を検索したいとします。カバレッジ範囲はステーションによって異なります。

次のようなドキュメントでいっぱいのコレクションがあります。

{
    'loc' : [-72,40],
    'radius' : 10
}

次のようなクエリ:

{'loc': { $near : coordinates, $maxDistance : 'radius'}};

しかし、それは正しくありません。

SQL クエリを作成する場合は、次のようなものを使用します。

SELECT * FROM table AS foo WHERE foo.radius ... (whatever your distance method looks like)

しかし、mongo クエリでその radius 変数にアクセスする方法がわかりません。これは可能ですか?

4

1 に答える 1

0

これをこのように行うことはできません。一般に、コレクション内の値に基づいて 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 ], 
        ] ]
    }
}
于 2013-07-25T21:22:01.183 に答える