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

mongo dbスキーマの円を定義するにはどうすればよいですか?

    "geospatialquery" に対して有効であるため 「場所」は経度、緯度である必要があります 順序であり、他の座標を含めることはできません。

    有効な形式は

    です
     { 
         "location": [long,lat]
     }
    

    または

     {
        "location": { "lng": long, "lat": lat }
     }
    

    またはGeoJSON

     {
         "location": {
             "type": "Point",
             "coordinates": [long,lat]
         }
     }
    

    「半径」などの別のフィールドは「別のフィールド」であり、できません 同じアレイの一部である。

    理想的にはGeoJSONをフォローしてください:

     {
         "location": {
             "type": "Point",
             "coordinates": [long,lat]
         },
         "radius": radius
     }
    

    マングーススキーマの定義では、次のように単純にすることができます:

    var geoSchema = new Schema({
        "location": {
            "type": String,
            "coordinates": []
        },
        "radius": Number
    });
    

    実際の「地球」座標で地理空間データを処理する場合、インデックスは "2dsphere" 、スキーマでオプションで次のように定義します:

    geoSchema.index({ "location": "2dsphere" })
    

    サポートされているGeoJSONでは「Circle」オブジェクトは実際にはサポートされていないため、別のフィールドを「半径」として保持し、「中心点」を保存することをお勧めします。

    他の「レガシー座標ペア」形式に対するGeoJSONの「大きな」利点は、あるポイントから geoNear または $ geoNear その場合、その「距離」は一貫して「メートル」で定義されます。これは、その結果との一貫性を保つために、ストレージ内の「半径」値を定義する方法でもあります。

    他のストレージ形式では、結果は「ラジアン」で返されます。これはおそらく変換したいものであり、測定値として円の「半径」を保存したくない場合があります。

    これに対処する方法は、次の形式のデータを検討することです。

    {
        "locationtype": "circle",
        "location": {
            "type": "Point",
            "coordinates": [1,1]
        },
        "radius": 4
    }
    

    次に、 .aggregate()を使用します。 $ geoNear ステージと $ redact フィルタリングするには:

    db.collection.aggregate([
        // Find points or objects "near" and project the distance
        { "$geoNear": {
            "near": {
                "type": "Point",
                "coordinates": [2,2]
            },
            "distanceField": "distance",
            "query": { "locationType": "circle" }
        }},
        // Logically filter anything outside of the radius
        { "$redact": {
            "$cond": {
                "if": { "$gt": [ "$distance", "$radius" ] },
                "then": "$$PRUNE",
                "else": "$$KEEP"
            }
        }}
    ])
    

    クエリの例で使用されている値は単なる例ですが、「実際の」経度と緯度の座標で示されているように、「距離」属性は設計どおりに機能し、前述の「メートル」の許容範囲内にあります。

    ここでのポイントは、 $ geoNear オブジェクトの種類に関係なく、両方とも「円」の中心に「近い」位置を見つけます。それだけでなく、ここでのコマンドは、「distanceField」で指定されているように、ここのドキュメント内の別のフィールドの「投影」を生成しています。これは、円の「中心」からの距離を「メートル」で表したものです。

    ここでの第2段階では、 $ redactを使用します $project<のようなものなので/ code> および $ match 1つのパイプラインステージ。 $ matchとは異なり この演算子は、ドキュメントに存在するフィールドを比較することにより、「論理」状態を評価できます。この場合、 $$のような操作PRUNE 一致したドキュメントを「if」条件に削除します。true 結果から「削除」するか、 $$ KEEP 条件がfalseであったドキュメント 。

    「一言で言えば」、「距離」が「より大きい」、「円」の「半径」である場合、オブジェクトは円の「外側」にあり、「交差」しません。それ以外の場合は「します」。

    これが、コレクション内のジオメトリの「円」を定義し、「それを使用して」「円」の半径内の「点」または他のタイプのオブジェクト間の交差のようなものを実現するための基本です。




    1. 複数のフィールドによるMongoDBテキスト検索フィルター

    2. dbpathを変更した後にMongodbサーバーが起動しない

    3. Laravelの編集ビューでレコードdromデータベースを取得するにはどうすればよいですか?

    4. Java用の最高のRedisライブラリ