MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Criar um índice geoespacial 2dsphere para consultas esféricas no MongoDB


O MongoDB fornece os seguintes tipos de índice geoespacial que suportam consultas geoespaciais.
  • Os índices 2D são compatíveis com consultas que calculam geometrias em um plano bidimensional.
  • 2dsphere os índices são compatíveis com consultas que calculam geometrias em uma esfera semelhante à Terra.

Neste artigo, crio um 2dsphere índice.

Coleção de exemplo


Suponha que tenhamos uma coleção chamada bars com os seguintes documentos:
{
	"_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
		]
	}
}

Cada documento tem informações de localização armazenadas como um objeto GeoJSON.

Um objeto GeoJSON tem um campo chamado type que especifica o tipo de objeto GeoJSON e um campo chamado coordinates que especifica as coordenadas do objeto.

Criar o índice 2dsphere


Agora vamos criar o 2dsphere índice.
db.bars.createIndex( { location : "2dsphere" } )

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

A 2dsphere índice já foi criado.

Agora podemos usar o getIndexes() método para verificar nosso índice:
db.bars.getIndexes()

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

Podemos ver que o índice foi criado como um 2dsphere index, usando 2dsphereIndexVersion de 3 , que é a versão padrão para minha instalação atual do MongoDB (4.4).

Criar um Índice 2dsphere Composto


Você pode incluir 2dsphere chaves de índice em índices compostos que são combinados com chaves de índice não geoespaciais.

Por exemplo, poderíamos ter combinado nossa location campo com o name campo para criar um índice composto.

Vamos descartar o índice e criar um índice composto:
db.bars.dropIndex("location_2dsphere")
db.bars.createIndex( { location : "2dsphere", name : 1 } )

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

E verifique o índice:
db.bars.getIndexes()

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

Composto 2dsphere os índices podem fazer referência a vários campos de local e não local. Isso contrasta com o composto 2d índices, que se limitam a referenciar apenas um campo de localização e um outro campo.

Alterando a 2dsphereIndexVersion


Você pode alterar o 2dsphereIndexVersion adicionando-o como um campo com o valor desejado ao criar o índice.

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

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

Confira o índice:
db.bars.getIndexes()

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

Este índice foi criado como um 2dsphere versão do índice 2.

A versão 2 é a versão padrão do 2dsphere índices criados nas séries MongoDB 2.6 e 3.0.

A versão 3 é a versão padrão do 2dsphere índices criados no MongoDB 3.2 e posterior (no momento da escrita).

Quando criei o índice sem especificar o 2dsphereIndexVersion campo, ele criou o índice usando a versão 3, porque essa é a versão padrão para minha versão do MongoDB (4.4).