MongoDB-고급 인덱싱

아래와 같이 users라는 컬렉션에 다음 문서를 삽입했습니다.

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

위의 문서에는 address sub-document 그리고 tags array.

배열 필드 인덱싱

사용자의 태그를 기반으로 사용자 문서를 검색한다고 가정합니다. 이를 위해 컬렉션의 태그 배열에 인덱스를 생성합니다.

배열에 인덱스를 생성하면 각 필드에 대해 별도의 인덱스 항목이 생성됩니다. 따라서 우리의 경우 태그 배열에 인덱스를 만들 때 음악, 크리켓 및 블로그 값에 대해 별도의 인덱스가 생성됩니다.

태그 배열에 인덱스를 생성하려면 다음 코드를 사용하십시오-

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

색인을 만든 후 다음과 같이 컬렉션의 태그 필드를 검색 할 수 있습니다.

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

적절한 인덱싱이 사용되었는지 확인하려면 다음을 사용하십시오. explain 명령-

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

이것은 당신에게 다음과 같은 결과를 제공합니다-

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

위의 명령으로 "cursor": "BtreeCursor tags_1"이 생성되어 적절한 인덱싱이 사용되었는지 확인합니다.

하위 문서 필드 인덱싱

도시, 주 및 핀 코드 필드를 기반으로 문서를 검색한다고 가정합니다. 이 모든 필드는 주소 하위 문서 필드의 일부이므로 하위 문서의 모든 필드에 색인을 생성합니다.

하위 문서의 세 필드 모두에 대한 색인을 생성하려면 다음 코드를 사용하십시오.

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

색인이 생성되면 다음과 같이이 색인을 사용하여 하위 문서 필드를 검색 할 수 있습니다.

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

쿼리 식은 지정된 인덱스의 순서를 따라야합니다. 따라서 위에서 생성 된 인덱스는 다음 쿼리를 지원합니다.

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