MongoDB - Indexação Avançada

inserimos o seguinte documento na coleção de usuários nomeados, conforme mostrado abaixo -

db.users.insert(
	{
		"address": {
			"city": "Los Angeles",
			"state": "California",
			"pincode": "123"
		},
		"tags": [
			"music",
			"cricket",
			"blogs"
		],
		"name": "Tom Benzamin"
	}
)

O documento acima contém um address sub-document e um tags array.

Campos de matriz de indexação

Suponha que desejamos pesquisar os documentos do usuário com base nas tags do usuário. Para isso, criaremos um índice no array de tags da coleção.

A criação de um índice na matriz, por sua vez, cria entradas de índice separadas para cada um de seus campos. Portanto, em nosso caso, quando criamos um índice na matriz de tags, índices separados serão criados para seus valores music, cricket e blogs.

Para criar um índice na matriz de tags, use o seguinte código -

>db.users.createIndex({"tags":1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 2,
"numIndexesAfter" : 3,
"ok" : 1
}
>

Depois de criar o índice, podemos pesquisar no campo de tags da coleção assim -

> db.users.find({tags:"cricket"}).pretty()
{
	"_id" : ObjectId("5dd7c927f1dd4583e7103fdf"),
	"address" : {
		"city" : "Los Angeles",
		"state" : "California",
		"pincode" : "123"
	},
	"tags" : [
		"music",
		"cricket",
		"blogs"
	],
	"name" : "Tom Benzamin"
}
>

Para verificar se a indexação adequada é usada, use o seguinte explain comando -

>db.users.find({tags:"cricket"}).explain()

Isso dá a você o seguinte resultado -

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "mydb.users",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"tags" : {
				"$eq" : "cricket"
			}
		},
		"queryHash" : "9D3B61A7",
		"planCacheKey" : "04C9997B",
		"winningPlan" : {
			"stage" : "FETCH",
			"inputStage" : {
				"stage" : "IXSCAN",
				"keyPattern" : {
					"tags" : 1
				},
				"indexName" : "tags_1",
				"isMultiKey" : false,
				"multiKeyPaths" : {
					"tags" : [ ]
				},
				"isUnique" : false,
				"isSparse" : false,
				"isPartial" : false,
				"indexVersion" : 2,
				"direction" : "forward",
				"indexBounds" : {
					"tags" : [
						"[\"cricket\", \"cricket\"]"
					]
				}
			}
		},
		"rejectedPlans" : [ ]
	},
	"serverInfo" : {
		"host" : "Krishna",
		"port" : 27017,
		"version" : "4.2.1",
		"gitVersion" : "edf6d45851c0b9ee15548f0f847df141764a317e"
	},
	"ok" : 1
}
>

O comando acima resultou em "cursor": "BtreeCursor tags_1" que confirma que a indexação adequada é usada.

Indexando campos de subdocumento

Suponha que desejamos pesquisar documentos com base nos campos de cidade, estado e código PIN. Como todos esses campos fazem parte do campo do subdocumento de endereço, criaremos um índice em todos os campos do subdocumento.

Para criar um índice em todos os três campos do subdocumento, use o seguinte código -

>db.users.createIndex({"address.city":1,"address.state":1,"address.pincode":1})
{
	"numIndexesBefore" : 4,
	"numIndexesAfter" : 4,
	"note" : "all indexes already exist",
	"ok" : 1
}
>

Assim que o índice for criado, podemos pesquisar qualquer um dos campos do sub-documento utilizando este índice da seguinte maneira -

> db.users.find({"address.city":"Los Angeles"}).pretty()
{
	"_id" : ObjectId("5dd7c927f1dd4583e7103fdf"),
	"address" : {
		"city" : "Los Angeles",
		"state" : "California",
		"pincode" : "123"
	},
	"tags" : [
		"music",
		"cricket",
		"blogs"
	],
	"name" : "Tom Benzamin"
}

Lembre-se de que a expressão da consulta deve seguir a ordem do índice especificado. Portanto, o índice criado acima suportaria as seguintes consultas -

>db.users.find({"address.city":"Los Angeles","address.state":"California"}).pretty()
{
	"_id" : ObjectId("5dd7c927f1dd4583e7103fdf"),
	"address" : {
		"city" : "Los Angeles",
		"state" : "California",
		"pincode" : "123"
	},
	"tags" : [
		"music",
		"cricket",
		"blogs"
	],
	"name" : "Tom Benzamin"
}
>