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.