sql >> Databáze >  >> NoSQL >> MongoDB

Oprava „zeměpisná délka/šířka je mimo hranice“ v MongoDB při vytváření indexu 2dsphere

Pokud se vám při pokusu o vytvoření indexu 2dsphere v MongoDB zobrazuje chyba „zeměpisná délka/šířka je mimo rozsah“, může to být způsobeno tím, že vaše souřadnice zeměpisné délky a šířky jsou ve špatném pořadí.

Když vytváříte objekt GeoJSON, musíte nejprve uvést zeměpisnou délku a poté zeměpisnou šířku.

  • Platné hodnoty zeměpisné délky jsou mezi -180 a 180 , obojí včetně.
  • Platné hodnoty zeměpisné šířky jsou mezi -90 a 90 , obojí včetně.

Pokud se vám tedy zobrazuje chyba „zeměpisná délka/šířka je mimo rozsah“, zkontrolujte své dokumenty a zjistěte, v jakém pořadí jsou souřadnice zeměpisné šířky a délky.

Příklad chyby

Zde je příklad kolekce s názvem bars který obsahuje dokumenty se souřadnicemi ve špatném pořadí.

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

Pokud se pokusíme vytvořit index 2dsphere na location pole, dostaneme chybu.

Příklad:

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

Výsledek:

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

Příklad se správným pořadím souřadnic

Zde je sbírka znovu, kromě souřadnic ve správném pořadí:

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

Nyní vytvoříme index 2dsphere na location pole:

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

Výsledek:

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

To znamená, že byl vytvořen.

Můžeme to zkontrolovat pomocí getIndexes() metoda:

db.bars.getIndexes()

Výsledek:

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

  1. 8 způsobů, jak získat den z rande v MongoDB

  2. Pokud mám id dokumentu mongo jako řetězec, jak jej mohu zadat jako _id?

  3. Může redis zpracovat více příkazů, které závisí na předchozích?

  4. Aktualizace Mongoose se neaktualizuje:{ ok:0, n:0, nUpraveno:0 }