MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Cách unhideIndex () hoạt động trong MongoDB

Trong MongoDB, db.collection.unhideIndex() phương thức hiện một chỉ mục ẩn.

Chỉ mục ẩn là chỉ mục bị ẩn khỏi công cụ lập kế hoạch truy vấn. Khi bạn hiện một chỉ mục, chỉ mục đó không còn bị ẩn khỏi công cụ lập kế hoạch truy vấn nữa và nó sẽ ngay lập tức có sẵn để sử dụng.

Ví dụ

Giả sử chúng ta có một bộ sưu tập có tên là pets và chúng tôi muốn kiểm tra nó để tìm các chỉ mục ẩn. Chúng tôi có thể chạy truy vấn sau để trả về tất cả các chỉ mục trên bộ sưu tập:

db.pets.getIndexes()

Kết quả:

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"name" : 1,
			"type" : -1
		},
		"name" : "idx_name_1_type_-1"
	},
	{
		"v" : 2,
		"key" : {
			"weight" : -1
		},
		"name" : "idx_weight_-1",
		"hidden" : true
	}
]

Chúng ta có thể thấy rằng có ba chỉ mục. Cái thứ ba bị ẩn. Chúng tôi biết điều đó, vì nó có "hidden" : true .

Chỉ mục đó nằm trên weight đồng ruộng. Khi chúng tôi chạy một truy vấn thông qua kế hoạch truy vấn truy vấn weight , chúng tôi sẽ thấy rằng nó không sử dụng chỉ mục.

Ví dụ:

db.pets.find( { weight: { $gt: 10 } } ).explain()

Kết quả:

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "PetHouse.pets",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"weight" : {
				"$gt" : 10
			}
		},
		"queryHash" : "CEB852E7",
		"planCacheKey" : "851FBDB5",
		"winningPlan" : {
			"stage" : "COLLSCAN",
			"filter" : {
				"weight" : {
					"$gt" : 10
				}
			},
			"direction" : "forward"
		},
		"rejectedPlans" : [ ]
	},
	"ok" : 1
}

Chúng ta có thể thấy rằng nó đã thực hiện một COLLSCAN (quét bộ sưu tập), có nghĩa là nó không sử dụng chỉ mục.

Hiện chỉ mục

Chúng ta có thể sử dụng unhideIndex() phương thức để hiện chỉ mục. Phương thức này chấp nhận tên của chỉ mục hoặc mẫu khóa của nó làm tham số để chỉ định chỉ mục nào cần bỏ ẩn.

Ví dụ:

db.pets.unhideIndex("idx_weight_-1")

Đầu ra:

{ "hidden_old" : true, "hidden_new" : false, "ok" : 1 }

Đầu ra của unhideIndex() phương thức hiển thị giá trị cũ cho hidden trường (trong trường hợp này là true ) và giá trị mới (trong trường hợp này là false ).

Tuy nhiên, nếu chúng tôi hiện một chỉ mục đã được hiển thị (hoặc ẩn một chỉ mục đã bị ẩn), những chỉ mục này sẽ không được hiển thị và chúng tôi chỉ nhận được những điều sau:

{ "ok" : 1 }

Bất kể, chỉ mục hiện đang được hiển thị.

Kiểm tra lại Kế hoạch truy vấn

Hãy chạy lại truy vấn trước đó để xem kế hoạch truy vấn bây giờ trông như thế nào.

db.pets.find( { weight: { $gt: 10 } } ).explain()

Kết quả:

{
	"queryPlanner" : {
		"plannerVersion" : 1,
		"namespace" : "PetHouse.pets",
		"indexFilterSet" : false,
		"parsedQuery" : {
			"weight" : {
				"$gt" : 10
			}
		},
		"queryHash" : "CEB852E7",
		"planCacheKey" : "851FBDB5",
		"winningPlan" : {
			"stage" : "FETCH",
			"inputStage" : {
				"stage" : "IXSCAN",
				"keyPattern" : {
					"weight" : -1
				},
				"indexName" : "idx_weight_-1",
				"isMultiKey" : false,
				"multiKeyPaths" : {
					"weight" : [ ]
				},
				"isUnique" : false,
				"isSparse" : false,
				"isPartial" : false,
				"indexVersion" : 2,
				"direction" : "forward",
				"indexBounds" : {
					"weight" : [
						"[inf.0, 10.0)"
					]
				}
			}
		},
		"rejectedPlans" : [ ]
	},
	"ok" : 1
}

Chúng ta có thể thấy rằng nó đã sử dụng IXSCAN , có nghĩa là nó đã sử dụng chỉ mục.

Kiểm tra xem chỉ mục đã được ẩn chưa

Chúng ta có thể sử dụng getIndexes() một lần nữa để kiểm tra xem chỉ mục đã được bỏ ẩn hay chưa.

db.pets.getIndexes()

Kết quả:

[
	{
		"v" : 2,
		"key" : {
			"_id" : 1
		},
		"name" : "_id_"
	},
	{
		"v" : 2,
		"key" : {
			"name" : 1,
			"type" : -1
		},
		"name" : "idx_name_1_type_-1"
	},
	{
		"v" : 2,
		"key" : {
			"weight" : -1
		},
		"name" : "idx_weight_-1"
	}
]

Chúng tôi thấy ba chỉ mục giống nhau mà chúng tôi đã thấy trong ví dụ trước đó, nhưng lần này chúng tôi không thấy "hidden" : true .

Nhưng chúng tôi cũng không thấy "hidden" : false .

Việc hiển thị một chỉ mục chỉ đơn giản là loại bỏ "hidden" : true một phần từ kết quả của getIndexes() . hidden tùy chọn chỉ khả dụng nếu giá trị là true . hidden tùy chọn là một giá trị boolean, vì vậy chúng tôi có thể suy ra rằng nếu nó không phải là "hidden" : true , thì nó là "hidden" : false .

Không thể ẩn / hiện chỉ mục? Kiểm tra Cài đặt này.

mongod featureCompatibilityVersion ít nhất phải là 4.4 trước khi bạn có thể ẩn các chỉ mục. Tuy nhiên, sau khi bị ẩn, chỉ mục sẽ vẫn bị ẩn ngay cả với featureCompatibilityVersion đặt thành 4.2 trên tệp nhị phân MongoDB 4.4.

Bạn có thể kiểm tra featureCompatibilityVersion cài đặt bằng mã sau:

db.adminCommand( 
    { 
        getParameter: 1, 
        featureCompatibilityVersion: 1 
    } 
)

Bạn có thể đặt nó bằng setFeatureCompatibilityVersion lệnh:

db.adminCommand( { setFeatureCompatibilityVersion: "4.4" } )

setFeatureCompatibilityVersion lệnh cần được chạy trong admin cơ sở dữ liệu.

Cũng lưu ý, bạn không thể ẩn _id chỉ mục.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách phát triển ứng dụng cho MongoDB và Redpanda bằng Docker Compose

  2. MongoDB:Làm cách nào để cập nhật một thành phần con duy nhất trong một mảng, được tham chiếu bởi chỉ mục trong mảng?

  3. Từ chối lời hứa chưa được xử lý:Lỗi:URL không đúng định dạng, không thể phân tích cú pháp

  4. Trả về các phần tử mảng bên trong từ nhiều tài liệu ở dạng đã sắp xếp

  5. Nhận danh sách các chỉ mục trong MongoDB