MongoDB - Erweiterte Indizierung

Wir haben das folgende Dokument wie unten gezeigt in die Sammlung mit dem Namen Benutzer eingefügt:

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

Das obige Dokument enthält eine address sub-document und ein tags array.

Indizieren von Array-Feldern

Angenommen, wir möchten Benutzerdokumente anhand der Tags des Benutzers durchsuchen. Zu diesem Zweck erstellen wir einen Index für das Tags-Array in der Sammlung.

Durch das Erstellen eines Index für ein Array werden wiederum separate Indexeinträge für jedes seiner Felder erstellt. In unserem Fall werden beim Erstellen eines Index für das Tags-Array separate Indizes für die Werte Musik, Cricket und Blogs erstellt.

Verwenden Sie den folgenden Code, um einen Index für das Tags-Array zu erstellen:

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

Nach dem Erstellen des Index können wir wie folgt im Tag-Feld der Sammlung suchen -

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

Verwenden Sie Folgendes, um zu überprüfen, ob die ordnungsgemäße Indizierung verwendet wird explain Befehl -

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

Dies gibt Ihnen das folgende Ergebnis -

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

Der obige Befehl führte zu "cursor": "BtreeCursor tags_1", was bestätigt, dass die richtige Indizierung verwendet wird.

Indizieren von Unterdokumentfeldern

Angenommen, wir möchten Dokumente basierend auf Stadt-, Bundesland- und Pincode-Feldern durchsuchen. Da alle diese Felder Teil des Adressunterdokumentfelds sind, erstellen wir einen Index für alle Felder des Unterdokuments.

Verwenden Sie den folgenden Code, um einen Index für alle drei Felder des Unterdokuments zu erstellen:

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

Sobald der Index erstellt ist, können wir mithilfe dieses Index nach folgenden Unterdokumentfeldern suchen:

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

Denken Sie daran, dass der Abfrageausdruck der Reihenfolge des angegebenen Index folgen muss. Der oben erstellte Index würde also die folgenden Abfragen unterstützen:

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