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).