MongoDB - Indexación avanzada

hemos insertado el siguiente documento en la colección de usuarios nombrados como se muestra a continuación:

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

El documento anterior contiene un address sub-document y un tags array.

Campos de matriz de indexación

Supongamos que queremos buscar documentos de usuario en función de las etiquetas del usuario. Para esto, crearemos un índice en la matriz de etiquetas en la colección.

La creación de un índice en una matriz a su vez crea entradas de índice independientes para cada uno de sus campos. Entonces, en nuestro caso, cuando creamos un índice en una matriz de etiquetas, se crearán índices separados para sus valores música, cricket y blogs.

Para crear un índice en una matriz de etiquetas, use el siguiente código:

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

Después de crear el índice, podemos buscar en el campo de etiquetas de la colección de esta manera:

> 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 que se utiliza la indexación adecuada, utilice lo siguiente explain comando -

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

Esto le da el siguiente 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
}
>

El comando anterior resultó en "cursor": "BtreeCursor tags_1" que confirma que se utiliza la indexación adecuada.

Indexación de campos de subdocumentos

Suponga que queremos buscar documentos basados ​​en campos de ciudad, estado y código PIN. Dado que todos estos campos son parte del campo del subdocumento de dirección, crearemos un índice en todos los campos del subdocumento.

Para crear un índice en los tres campos del subdocumento, use el siguiente 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
}
>

Una vez creado el índice, podemos buscar cualquiera de los campos del subdocumento utilizando este índice de la siguiente manera:

> 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"
}

Recuerde que la expresión de la consulta debe seguir el orden del índice especificado. Entonces, el índice creado anteriormente admitiría las siguientes 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"
}
>