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

2dsphereインデックスを作成するときのMongoDBの「経度/緯度が範囲外です」を修正

    MongoDBで2dsphereインデックスを作成しようとしたときに「経度/緯度が範囲外です」というエラーが発生する場合は、経度と緯度の座標の順序が間違っていることが原因である可能性があります。

    GeoJSONオブジェクトを作成するときは、最初に経度をリストし、次に緯度をリストする必要があります。

    • 有効な経度の値は-180の間です および180 、両方を含む。
    • 有効な緯度の値は-90の間です および90 、両方を含む。

    したがって、「経度/緯度が範囲外です」というエラーが発生した場合は、ドキュメントをチェックして、緯度と経度の座標がどの順序になっているのかを確認してください。

    エラーの例

    これがbarsというコレクションの例です 座標が間違った順序のドキュメントが含まれています。

    {
    	"_id" : 1,
    	"name" : "Boardwalk Social",
    	"location" : {
    		"type" : "Point",
    		"coordinates" : [
    			-16.919297718553366,
    			145.77675259719823
    		]
    	}
    }
    {
    	"_id" : 2,
    	"name" : "The Downunder Bar",
    	"location" : {
    		"type" : "Point",
    		"coordinates" : [
    			-16.92107838010542,
    			145.77621640842125
    		]
    	}
    }

    locationに2dsphereインデックスを作成しようとすると フィールドにエラーが発生します。

    例:

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

    結果:

    {
    	"ok" : 0,
    	"errmsg" : "Index build failed: 2bb26869-1dec-4484-b554-3ba55fc0c0de: Collection krankykranes.bars ( e1a99ee2-b77c-41a4-b833-25c4b3c599c3 ) :: caused by :: Can't extract geo keys: { _id: 1.0, name: \"Boardwalk Social\", location: { type: \"Point\", coordinates: [ -16.91929771855337, 145.7767525971982 ] } }  longitude/latitude is out of bounds, lng: -16.9193 lat: 145.777",
    	"code" : 16755,
    	"codeName" : "Location16755"
    }

    正しい座標順序の例

    正しい順序の座標を除いて、コレクションは次のとおりです。

    {
    	"_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
    		]
    	}
    }
    

    次に、locationに2dsphereインデックスを作成しましょう フィールド:

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

    結果:

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

    これは、それが作成されたことを意味します。

    これはgetIndexes()で確認できます 方法:

    db.bars.getIndexes()

    結果:

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

    1. 条件付きで2つの追加コレクションに参加する方法

    2. Dockerコンテナ内のRedis接続エラー

    3. 永続的なセッションを維持するためのMemcachev/ s redis?

    4. mongodbサービスが起動していません