MongoDB - Lập chỉ mục nâng cao

chúng tôi đã chèn tài liệu sau vào bộ sưu tập có tên người dùng như được hiển thị bên dưới -

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

Tài liệu trên chứa một address sub-document và một tags array.

Lập chỉ mục các trường mảng

Giả sử chúng ta muốn tìm kiếm tài liệu của người dùng dựa trên các thẻ của người dùng. Đối với điều này, chúng tôi sẽ tạo một chỉ mục trên mảng thẻ trong bộ sưu tập.

Lần lượt tạo chỉ mục trên mảng sẽ tạo ra các mục nhập chỉ mục riêng biệt cho từng trường của nó. Vì vậy, trong trường hợp của chúng tôi khi chúng tôi tạo chỉ mục trên mảng thẻ, các chỉ mục riêng biệt sẽ được tạo cho các giá trị của nó là âm nhạc, cricket và blog.

Để tạo chỉ mục trên mảng thẻ, hãy sử dụng đoạn mã sau:

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

Sau khi tạo chỉ mục, chúng ta có thể tìm kiếm trên trường thẻ của bộ sưu tập như thế này -

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

Để xác minh rằng lập chỉ mục thích hợp được sử dụng, hãy sử dụng explain lệnh -

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

Điều này cho bạn kết quả sau:

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

Lệnh trên dẫn đến "con trỏ": "BtreeCursor tags_1" xác nhận rằng lập chỉ mục thích hợp được sử dụng.

Lập chỉ mục các trường tài liệu con

Giả sử rằng chúng ta muốn tìm kiếm tài liệu dựa trên các trường thành phố, tiểu bang và mã pin. Vì tất cả các trường này là một phần của trường tài liệu con địa chỉ, chúng tôi sẽ tạo một chỉ mục trên tất cả các trường của tài liệu con.

Để tạo chỉ mục trên tất cả ba trường của tài liệu con, hãy sử dụng mã sau:

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

Khi chỉ mục được tạo, chúng tôi có thể tìm kiếm bất kỳ trường tài liệu con nào sử dụng chỉ mục này như sau:

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

Hãy nhớ rằng biểu thức truy vấn phải tuân theo thứ tự của chỉ mục được chỉ định. Vì vậy, chỉ mục được tạo ở trên sẽ hỗ trợ các truy vấn sau:

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