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

MongoDBの半径内の場所をクエリする

    これは3ステップのプロセスです。

    • ステップ1)ドキュメント内にGeoJSONポイントを埋め込みます。
    • ステップ2)2dsphereを使用して、ポイントへのパスにインデックスを付けます 。
    • ステップ3)$geoWithinを使用してドキュメント内のポイントをクエリします および$centerSphere

    地理空間クエリを実行するには、GeoJSONに一致するようにドキュメント構造を変更する必要があります。 ポイント。これは次のようになります。

    loc : {
        type : "Point",
        coordinates : [lng, lat]
    }
    

    コレクションをポイント形式に変換するためのサンプルコード。

    // sample setup code.
    // use test; 
    // db.positions.drop();
    // db.positions.insert({
        // pos : {
            // lat : 0,
            // lon : 30
        // }
    // });
    db.positions.find().forEach(function (doc) {
        var point = {
            _id : doc._id,
            loc : {
                type : "Point",
                coordinates : [doc.pos.lon, doc.pos.lat]
            }
        };
        db.positions.update(doc, point);
    });
    db.positions.find().pretty();
    

    その後、$geoWithinを使用できます および$near 以下の例のようなクエリの演算子。

    セットアップ

    var createLandmarkDoc = function (name, lng, lat) {
        return {
            name : name,
            loc : {
                type : "Point",
                coordinates : [lng, lat]
            }
        };
    };
    var addNewLandmark = function(name, lng, lat){
        db.landmarks.insert(createLandmarkDoc(name, lng, lat));
    };
    
    db.landmarks.drop();
    // Step 1: Add points.
    addNewLandmark("Washington DC", 38.8993487, -77.0145665);
    addNewLandmark("White House", 38.9024593, -77.0388266);
    addNewLandmark("Library of Congress", 38.888684, -77.0047189);
    addNewLandmark("Patuxent Research Refuge", 39.0391718, -76.8216182);
    addNewLandmark("The Pentagon", 38.871857, -77.056267);
    addNewLandmark("Massachusetts Institute of Technology", 42.360091, -71.09416);
    
    // Step 2: Create index
    db.landmarks.ensureIndex({
        loc : "2dsphere"
    });
    

    クエリ:5マイル以内のランドマークを検索します。

    var milesToRadian = function(miles){
        var earthRadiusInMiles = 3959;
        return miles / earthRadiusInMiles;
    };
    var landmark = db.landmarks.findOne({name: "Washington DC"});
    var query = {
        "loc" : {
            $geoWithin : {
                $centerSphere : [landmark.loc.coordinates, milesToRadian(5) ]
            }
        }
    };
    // Step 3: Query points.
    db.landmarks.find(query).pretty();
    

    出力

    {
            "_id" : ObjectId("540e70c96033ed0d2d9694fa"),
            "name" : "Washington DC",
            "loc" : {
                    "type" : "Point",
                    "coordinates" : [
                            38.8993487,
                            -77.0145665
                    ]
            }
    }
    {
            "_id" : ObjectId("540e70c96033ed0d2d9694fc"),
            "name" : "Library of Congress",
            "loc" : {
                    "type" : "Point",
                    "coordinates" : [
                            38.888684,
                            -77.0047189
                    ]
            }
    }
    {
            "_id" : ObjectId("540e70c96033ed0d2d9694fb"),
            "name" : "White House",
            "loc" : {
                    "type" : "Point",
                    "coordinates" : [
                            38.9024593,
                            -77.0388266
                    ]
            }
    }
    {
            "_id" : ObjectId("540e70c96033ed0d2d9694fe"),
            "name" : "The Pentagon",
            "loc" : {
                    "type" : "Point",
                    "coordinates" : [
                            38.871857,
                            -77.056267
                    ]
            }
    }
    

    詳細:



    1. MongoDBでデータベースとコレクションを管理する方法

    2. 1つのドキュメントの一部であるオブジェクトの配列から1つの要素を取得します(マングース)

    3. skip()およびlimit()で使用されるDistinct()コマンド

    4. CouchbaseDbaの便利なスクリプト