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

MongoDBで球形クエリの2dsphere地理空間インデックスを作成します

    MongoDBは、地理空間クエリをサポートする次の地理空間インデックスタイプを提供します。

    • 2dインデックスは、2次元平面上のジオメトリを計算するクエリをサポートします。
    • 2dsphere インデックスは、地球のような球のジオメトリを計算するクエリをサポートしています。

    この記事では、2dsphereを作成します インデックス。

    サンプルコレクション

    barsというコレクションがあるとします。 次のドキュメントを使用:

    {
    	"_id" : 1,
    	"name" : "Boardwalk Social",
    	"location" : {
    		"type" : "Point",
    		"coordinates" : [
    			145.77675259719823,
    			-16.919297718553366
    		]
    	}
    }
    {
    	"_id" : 2,
    	"name" : "The Downunder Bar",
    	"location" : {
    		"type" : "Point",
    		"coordinates" : [
    			145.77621640842125,
    			-16.92107838010542
    		]
    	}
    }
    {
    	"_id" : 3,
    	"name" : "Riley",
    	"location" : {
    		"type" : "Point",
    		"coordinates" : [
    			145.7739955395154,
    			-16.916028253292883
    		]
    	}
    }
    {
    	"_id" : 4,
    	"name" : "Salt House",
    	"location" : {
    		"type" : "Point",
    		"coordinates" : [
    			145.78148426655065,
    			-16.91823513430776
    		]
    	}
    }
    {
    	"_id" : 5,
    	"name" : "Rattle n Hum",
    	"location" : {
    		"type" : "Point",
    		"coordinates" : [
    			145.77746095331537,
    			-16.920051942529685
    		]
    	}
    }

    各ドキュメントには、GeoJSONオブジェクトとして保存された位置情報があります。

    GeoJSONオブジェクトには、typeという名前のフィールドがあります GeoJSONオブジェクトタイプとcoordinatesという名前のフィールドを指定します オブジェクトの座標を指定します。

    2dsphereインデックスを作成する

    それでは、2dsphereを作成しましょう。 インデックス。

    db.bars.createIndex( { location : "2dsphere" } )

    出力:

    {
    	"createdCollectionAutomatically" : false,
    	"numIndexesBefore" : 1,
    	"numIndexesAfter" : 2,
    	"ok" : 1
    }

    2dsphere これでインデックスが作成されました。

    これで、getIndexes()を使用できます インデックスを確認する方法:

    db.bars.getIndexes()

    結果:

    [
    	{
    		"v" : 2,
    		"key" : {
    			"_id" : 1
    		},
    		"name" : "_id_"
    	},
    	{
    		"v" : 2,
    		"key" : {
    			"location" : "2dsphere"
    		},
    		"name" : "location_2dsphere",
    		"2dsphereIndexVersion" : 3
    	}
    ]

    インデックスが2dsphereとして作成されたことがわかります 2dsphereIndexVersionを使用したインデックス 3の 、これは私の現在のMongoDBインストール(4.4)のデフォルトバージョンです。

    複合2dsphereインデックスを作成する

    2dsphereを含めることができます 非地理空間インデックスキーと組み合わされた複合インデックスのインデックスキー。

    たとえば、locationを組み合わせることができます nameのフィールド 複合インデックスを作成するフィールド。

    インデックスを削除して、複合インデックスを作成しましょう:

    db.bars.dropIndex("location_2dsphere")
    db.bars.createIndex( { location : "2dsphere", name : 1 } )

    出力:

    {
    	"createdCollectionAutomatically" : false,
    	"numIndexesBefore" : 1,
    	"numIndexesAfter" : 2,
    	"ok" : 1
    }

    そして、インデックスを確認してください:

    db.bars.getIndexes()

    結果:

    [
    	{
    		"v" : 2,
    		"key" : {
    			"_id" : 1
    		},
    		"name" : "_id_"
    	},
    	{
    		"v" : 2,
    		"key" : {
    			"location" : "2dsphere",
    			"name" : 1
    		},
    		"name" : "location_2dsphere_name_1",
    		"2dsphereIndexVersion" : 3
    	}
    ]

    複合2dsphere インデックスは、複数の場所フィールドと非場所フィールドを参照できます。これは、複合2dとは対照的です。 インデックス。1つのロケーションフィールドと他の1つのフィールドのみを参照するように制限されています。

    2dsphereIndexVersionの変更

    2dsphereIndexVersionを変更できます インデックスを作成するときに、目的の値を持つフィールドとして追加します。

    例:

    db.bars.createIndex( 
        { location : "2dsphere" },
        { "2dsphereIndexVersion" : 2 }
    )

    出力:

    {
    	"createdCollectionAutomatically" : false,
    	"numIndexesBefore" : 1,
    	"numIndexesAfter" : 2,
    	"ok" : 1
    }

    インデックスを確認してください:

    db.bars.getIndexes()

    結果:

    [
    	{
    		"v" : 2,
    		"key" : {
    			"_id" : 1
    		},
    		"name" : "_id_"
    	},
    	{
    		"v" : 2,
    		"key" : {
    			"location" : "2dsphere"
    		},
    		"name" : "location_2dsphere",
    		"2dsphereIndexVersion" : 2
    	}
    ]

    このインデックスは2dsphereとして作成されました インデックスバージョン2。

    バージョン2は、2dsphereのデフォルトバージョンです。 MongoDB2.6および3.0シリーズで作成されたインデックス。

    バージョン3は、2dsphereのデフォルトバージョンです。 MongoDB 3.2以降で作成されたインデックス(執筆時点)。

    2dsphereIndexVersionを指定せずにインデックスを作成したとき フィールドでは、バージョン3を使用してインデックスを作成しました。これは、バージョン3が私のMongoDBバージョン(4.4)のデフォルトバージョンであるためです。


    1. redisリスナーの作成-phpで可能ですか?

    2. MongoDB-オブジェクト?なぜ集約して_idが必要なのですか

    3. Redis:あるキーを別のキーの値と等しく設定するにはどうすればよいですか?

    4. Springを使用して認証が必要なMongoDBに接続する方法