sql >> Database >  >> NoSQL >> MongoDB

Maak een 2dsphere Geospatial Index voor sferische zoekopdrachten in MongoDB

MongoDB biedt de volgende geospatiale indextypen die geospatiale query's ondersteunen.

  • 2D-indexen ondersteunen zoekopdrachten die geometrieën berekenen op een tweedimensionaal vlak.
  • 2dsphere indexen ondersteunen zoekopdrachten die geometrieën berekenen op een aardachtige bol.

In dit artikel maak ik een 2dsphere index.

Voorbeeldverzameling

Stel dat we een verzameling hebben met de naam bars met de volgende documenten:

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

Elk document heeft locatie-informatie die is opgeslagen als een GeoJSON-object.

Een GeoJSON-object heeft een veld met de naam type dat het GeoJSON-objecttype specificeert en een veld met de naam coordinates die de coördinaten van het object specificeert.

Maak de 2dsphere-index

Laten we nu de 2dsphere . maken index.

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

Uitgang:

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

De 2dsphere index is nu aangemaakt.

We kunnen nu de getIndexes() . gebruiken methode om onze index te controleren:

db.bars.getIndexes()

Resultaat:

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

We kunnen zien dat de index is gemaakt als een 2dsphere index, met behulp van 2dsphereIndexVersion van 3 , wat de standaardversie is voor mijn huidige MongoDB-installatie (4.4).

Een samengestelde 2dsphere-index maken

U kunt 2dsphere . opnemen indexsleutels in samengestelde indexen die worden gecombineerd met niet-geospatiale indexsleutels.

We hadden bijvoorbeeld onze location . kunnen combineren veld met de name veld om een ​​samengestelde index te maken.

Laten we de index laten vallen en een samengestelde index maken:

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

Uitgang:

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

En controleer de index:

db.bars.getIndexes()

Resultaat:

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

Samengestelde 2dsphere indexen kunnen verwijzen naar meerdere locatie- en niet-locatievelden. Dit in tegenstelling tot samengestelde 2d indexen, die beperkt zijn tot het verwijzen naar slechts één locatieveld en één ander veld.

De 2dsphereIndexVersion wijzigen

U kunt de 2dsphereIndexVersion . wijzigen door het toe te voegen als een veld met de gewenste waarde bij het maken van de index.

Voorbeeld:

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

Uitgang:

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

Controleer de index:

db.bars.getIndexes()

Resultaat:

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

Deze index is gemaakt als een 2dsphere index versie 2.

Versie 2 is de standaardversie van 2dsphere indexen gemaakt in de MongoDB 2.6- en 3.0-serie.

Versie 3 is de standaardversie van 2dsphere indexen gemaakt in MongoDB 3.2 en later (op het moment van schrijven).

Toen ik de index maakte zonder de 2dsphereIndexVersion . op te geven veld, het heeft de index gemaakt met versie 3, omdat dat de standaardversie is voor mijn MongoDB-versie (4.4).


  1. Hoe automatisch bedraad RedisTemplate<String,Long>

  2. Importeer csv-gegevens als array in mongodb met behulp van mongoimport

  3. Robuuste berichtserialisatie in Apache Kafka met behulp van Apache Avro, deel 1

  4. Moet ik altijd pipelining gebruiken als er meer dan 1 commando in Redis is?