MongoDB fornisce i seguenti tipi di indici geospaziali che supportano le query geospaziali.
- Gli indici 2d supportano le query che calcolano le geometrie su un piano bidimensionale.
2dsphere
gli indici supportano query che calcolano le geometrie su una sfera simile alla terra.
In questo articolo creo una 2dsphere
indice.
Raccolta di esempi
Supponiamo di avere una collezione chiamata bars
con i seguenti documenti:
{ "_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 ] } }
Ogni documento ha informazioni sulla posizione memorizzate come oggetto GeoJSON.
Un oggetto GeoJSON ha un campo denominato type
che specifica il tipo di oggetto GeoJSON e un campo denominato coordinates
che specifica le coordinate dell'oggetto.
Crea l'indice 2dsphere
Ora creiamo la 2dsphere
indice.
db.bars.createIndex( { location : "2dsphere" } )
Uscita:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
La 2dsphere
l'indice è stato creato.
Ora possiamo usare getIndexes()
metodo per controllare il nostro indice:
db.bars.getIndexes()
Risultato:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "location" : "2dsphere" }, "name" : "location_2dsphere", "2dsphereIndexVersion" : 3 } ]
Possiamo vedere che l'indice è stato creato come 2dsphere
index, utilizzando 2dsphereIndexVersion
di 3
, che è la versione predefinita per la mia attuale installazione di MongoDB (4.4).
Crea un indice 2dsphere composto
Puoi includere 2dsphere
chiavi di indice in indici composti combinati con chiavi di indice non geospaziali.
Ad esempio, avremmo potuto combinare la nostra location
campo con il name
campo per creare un indice composto.
Rilasciamo l'indice e creiamo un indice composto:
db.bars.dropIndex("location_2dsphere")
db.bars.createIndex( { location : "2dsphere", name : 1 } )
Uscita:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
E controlla l'indice:
db.bars.getIndexes()
Risultato:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "location" : "2dsphere", "name" : 1 }, "name" : "location_2dsphere_name_1", "2dsphereIndexVersion" : 3 } ]
Composto 2dsphere
gli indici possono fare riferimento a più campi di posizione e non di posizione. Questo è in contrasto con il composto 2d
indici, che si limitano a fare riferimento a un solo campo posizione e un altro campo.
Modifica della 2dsphereIndexVersion
Puoi modificare 2dsphereIndexVersion
aggiungendolo come campo con il valore desiderato durante la creazione dell'indice.
Esempio:
db.bars.createIndex(
{ location : "2dsphere" },
{ "2dsphereIndexVersion" : 2 }
)
Uscita:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 1, "numIndexesAfter" : 2, "ok" : 1 }
Controlla l'indice:
db.bars.getIndexes()
Risultato:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "location" : "2dsphere" }, "name" : "location_2dsphere", "2dsphereIndexVersion" : 2 } ]
Questo indice è stato creato come 2dsphere
indice versione 2.
La versione 2 è la versione predefinita di 2dsphere
indici creati nelle serie MongoDB 2.6 e 3.0.
La versione 3 è la versione predefinita di 2dsphere
indici creati in MongoDB 3.2 e versioni successive (al momento della scrittura).
Quando ho creato l'indice senza specificare 2dsphereIndexVersion
campo, ha creato l'indice utilizzando la versione 3, perché questa è la versione predefinita per la mia versione MongoDB (4.4).