MongoDB tillhandahåller följande geospatiala indextyper som stöder geospatiala frågor.
- 2D-index stöder frågor som beräknar geometrier på ett tvådimensionellt plan.
2dsphere
index stöder frågor som beräknar geometrier på en jordliknande sfär.
I den här artikeln skapar jag en 2dsphere
index.
Exempelsamling
Anta att vi har en samling som heter bars
med följande dokument:
{ "_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 ] } }
Varje dokument har platsinformation lagrad som ett GeoJSON-objekt.
Ett GeoJSON-objekt har ett fält som heter type
som anger GeoJSON-objekttypen och ett fält med namnet coordinates
som anger objektets koordinater.
Skapa 2dsphere-indexet
Låt oss nu skapa 2dsphere
index.
db.bars.createIndex( { location : "2dsphere" } )
Utdata:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
2dsphere
index har nu skapats.
Vi kan nu använda getIndexes()
metod för att kontrollera vårt index:
db.bars.getIndexes()
Resultat:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "location" : "2dsphere" }, "name" : "location_2dsphere", "2dsphereIndexVersion" : 3 } ]
Vi kan se att indexet skapades som en 2dsphere
index, med 2dsphereIndexVersion
av 3
, vilket är standardversionen för min nuvarande MongoDB-installation (4.4).
Skapa ett sammansatt 2dsphere-index
Du kan inkludera 2dsphere
indexnycklar i sammansatta index som kombineras med icke-geospatiala indexnycklar.
Vi kunde till exempel ha kombinerat vår location
fältet med name
för att skapa ett sammansatt index.
Låt oss släppa indexet och skapa ett sammansatt index:
db.bars.dropIndex("location_2dsphere")
db.bars.createIndex( { location : "2dsphere", name : 1 } )
Utdata:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Och kolla indexet:
db.bars.getIndexes()
Resultat:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "location" : "2dsphere", "name" : 1 }, "name" : "location_2dsphere_name_1", "2dsphereIndexVersion" : 3 } ]
Sammansatt 2dsphere
index kan referera till flera plats- och icke-platsfält. Detta är i motsats till sammansatt 2d
index, som är begränsade till att endast referera till ett platsfält och ett annat fält.
Ändra 2dsphereIndexVersion
Du kan ändra 2dsphereIndexVersion
genom att lägga till det som ett fält med önskat värde när du skapar indexet.
Exempel:
db.bars.createIndex(
{ location : "2dsphere" },
{ "2dsphereIndexVersion" : 2 }
)
Utdata:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Kontrollera indexet:
db.bars.getIndexes()
Resultat:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "location" : "2dsphere" }, "name" : "location_2dsphere", "2dsphereIndexVersion" : 2 } ]
Detta index har skapats som en 2dsphere
index version 2.
Version 2 är standardversionen av 2dsphere
index skapade i MongoDB 2.6- och 3.0-serien.
Version 3 är standardversionen av 2dsphere
index skapade i MongoDB 3.2 och senare (i skrivande stund).
När jag skapade indexet utan att ange 2dsphereIndexVersion
fältet skapade den indexet med version 3, eftersom det är standardversionen för min MongoDB-version (4.4).