MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Correction de "la longitude/latitude est hors limites" dans MongoDB lors de la création d'un index 2dsphere

Si vous obtenez une erreur "longitude/latitude est hors limites" lorsque vous essayez de créer un index 2dsphere dans MongoDB, cela peut être dû au fait que vos coordonnées de longitude et de latitude sont dans le mauvais ordre.

Lorsque vous créez un objet GeoJSON, vous devez d'abord indiquer la longitude, puis la latitude.

  • Les valeurs de longitude valides sont comprises entre -180 et 180 , tous deux inclus.
  • Les valeurs de latitude valides sont comprises entre -90 et 90 , tous deux inclus.

Par conséquent, si vous obtenez l'erreur "longitude/latitude est hors limites", vérifiez vos documents pour voir dans quel ordre se trouvent les coordonnées de latitude et de longitude.

Exemple d'erreur

Voici un exemple de collection appelée bars qui contient des documents avec des coordonnées dans le mauvais ordre.

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

Si nous essayons de créer un index 2dsphere sur le location champ, nous obtiendrons une erreur.

Exemple :

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

Résultat :

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

Exemple avec un ordre de coordonnées correct

Voici à nouveau la collection, sauf avec les coordonnées dans le bon ordre :

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

Créons maintenant un index 2dsphere sur location champ :

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

Résultat :

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

Cela signifie qu'il a été créé.

Nous pouvons vérifier cela avec le getIndexes() méthode :

db.bars.getIndexes()

Résultat :

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