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

MongoDB 고급 인덱스

이름이 users인 컬렉션에 다음과 같은 문서를 삽입했습니다. 예를 들어–

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

위의 문서는 address 서브 문서와 태그 배열을 포함하고 있습니다.

인덱스 배열 필드

사용자의 태그를 기준으로 사용자 문서를 검색하려면, 컬렉션의 tags 배열에 인덱스를 생성합니다.

배열에 인덱스를 생성하면 배열의 각 필드에 각각의 인덱스 항목을 생성합니다. 따라서 우리의 예제에서 tags 배열에 인덱스를 생성하면 music, cricket, blogs의 값을 각각의 독립적인 인덱스로 생성합니다.

tags 배열에 인덱스를 생성하려면 다음 코드를 사용하세요-

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

인덱스를 생성한 후, tags 필드에서 검색할 수 있습니다. 예를 들어-

>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
		
			"tags": {
				
			}
		},
		"queryHash": ",9D3B61A7",
		"planCacheKey": "049997
		
			
			
				
				"keyPattern": {
					"tags": 1
				},
				1",
				
				
					
				},
				
				
				"isPartial": false,
				 2,
				
				"indexBounds": {
					"tags" : [
						"[\"cricket\", "cricket\"]"
					
				}
			}
		},
		
	},
	
		"host": "Krishna",
		 27017,
		"version": "",4.2.1",
		"gitVersion": "edf6d45851c0b9ee15548f0f847df141764a317e"
	},
	"ok": 1
}
>

위 명령어는 “cursor”를 생성했습니다: “BtreeCursor tags_1”는 올바른 색인이 사용되었음을 확인합니다.

서브 문서 필드 색인

city, state 및 pincode 필드에 따라 문서를 검색하려고 할 때, 모든 이 필드가 주소 서브 문서 필드의 일부이므로 서브 문서의 모든 필드에 색인을 생성하겠습니다.

서브 문서의 모든 세 필드에 색인을 생성하려면 다음 코드를 사용하십시오-

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