English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Indici avanzati MongoDB

Abbiamo inserito i seguenti documenti nella raccolta users, come segue–

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

Il documento sopra contiene un sottodocumento address e un array di tag.

Indice su campo array

Supponiamo di voler cercare documenti di utenti in base ai tag. Per questo, creeremo un indice sull'array tags della raccolta.

Quando si crea un indice su un array, si creano singoli elementi di indice per ogni campo dell'array. Pertanto, nel nostro esempio, quando creiamo un indice sull'array tags, creiamo indici separati per i valori music, cricket e blogs.

Per creare un indice sull'array di tag, utilizzare il seguente codice-

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

Dopo aver creato l'indice, possiamo cercare nel campo tags della raccolta, come segue-

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

Per verificare se è stato utilizzato l'indice corretto, utilizzare il comando explain seguente-

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

Questo vi fornisce i seguenti risultati-

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

Il comando precedente ha generato il "cursor": "BtreeCursor tags_1", che conferma l'uso dell'indice corretto.

Indice dei campi del sottodocumento

Supponiamo di voler cercare i documenti in base ai campi city, state e pincode. Poiché tutti questi campi sono parte del sottodocumento di indirizzo, creeremo un indice su tutti i campi del sottodocumento.

Per creare un indice su tutti e tre i campi del sottodocumento, utilizzare il seguente codice-

>db.users.createIndex({"address.city":1,"address.state":1,"address.pincode":1})
{
	"numIndexesBefore" : 4,
	"numIndexesAfter" : 4,
	"note" : "tutti gli indici esistono già",
	"ok" : 1
}
>

Dopo aver creato l'indice, possiamo utilizzare questo indice per cercare qualsiasi campo del sottodocumento, come mostrato di seguito:

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

Ricorda, l'espressione di ricerca deve seguire l'ordine degli indici specificati. Pertanto, gli indici creati sosterranno le seguenti query-

Ricorda, l'espressione di ricerca deve seguire l'ordine degli indici specificati. Pertanto, gli indici creati sosterranno le seguenti query-
	"_id" : ObjectId("5dd7c927f1dd4583e7103fdf"),
	"address" : {
		"city" : "Los Angeles",
		"state" : "California",
		"pincode" : "123"
	},
	"tags" : [
		"music",
		"cricket",
		"blogs"
	],
	"name" : "Tom Benzamin"
}
>