Bắt đầu từ MongoDB 4.4, bây giờ chúng ta có thể ẩn các chỉ mục khỏi kế hoạch truy vấn. Điều này cho phép chúng tôi đánh giá tác động tiềm ẩn của việc giảm chỉ số mà không thực sự giảm chỉ mục.
Nếu ẩn nó có tác động tiêu cực, chúng tôi có thể bỏ ẩn chỉ mục. Điều này giúp chúng tôi không phải bỏ chỉ mục, sau đó tạo lại chỉ mục.
Dưới đây là 3 cách để ẩn một chỉ mục trong MongoDB.
hideIndex()
Phương pháp
db.collection.hideIndex()
phương thức thực hiện chính xác như những gì nó hứa hẹn - nó ẩn chỉ mục (khỏi trình lập kế hoạch truy vấn).
Ví dụ:
db.pets.hideIndex("idx_weight_-1")
Đầu ra:
{ "hidden_old" : false, "hidden_new" : true, "ok" : 1 }
Điều đó ẩn một chỉ mục có tên là idx_weight_-1
trên pets
thu thập. Theo cách khác, chúng tôi có thể cung cấp mẫu khóa cho chỉ mục thay vì tên.
Đầu ra của hideIndex()
phương thức hiển thị giá trị cũ cho hidden
trường (trong trường hợp này là false
) và giá trị mới (trong trường hợp này là true
).
Tuy nhiên, nếu chúng tôi ẩn một chỉ mục đã bị ẩn (hoặc hiệ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 }
Trong mọi trường hợp, chỉ mục hiện bị ẩn.
hideIndex()
phương thức thực sự là một trình bao bọc cho collMod
lệnh quản trị (bên dưới).
collMod
Lệnh
collMod
lệnh quản trị cho phép chúng tôi thêm các tùy chọn vào một bộ sưu tập hoặc sửa đổi các định nghĩa chế độ xem.
Chúng tôi có thể sử dụng nó để ẩn một chỉ mục bằng cách chuyển hidden: true
.
Ví dụ:
db.runCommand( {
collMod: "pets",
index: {
name: "idx_weight_-1",
hidden: true
}
} )
Kết quả:
{ "hidden_old" : false, "hidden_new" : true, "ok" : 1 }
Điều này trả về cùng một tài liệu hideIndex()
lợi nhuận.
Tương tự với hideIndex()
, bạn có tùy chọn chỉ định tên chỉ mục hoặc mẫu khóa của nó.
Dưới đây là một ví dụ về việc sử dụng mẫu khóa:
db.runCommand( {
collMod: "pets",
index: {
keyPattern: { weight : -1 },
hidden: true
}
} )
Trong trường hợp này, chỉ mục được xác định bằng cách sử dụng { weight : -1 }
và do đó định nghĩa này có thể được sử dụng thay cho tên chỉ mục.
Để xác minh điều này, chúng tôi có thể sử dụng getIndexes()
để xem định nghĩa của chỉ mục:
db.pets.getIndexes()
Kết quả:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "weight" : -1 }, "name" : "idx_weight_-1", "hidden" : true } ]
Chúng tôi cũng có thể hiện chỉ mục bằng cách chuyển hidden: false
.
Tạo chỉ mục ẩn
Cách thứ ba để ẩn một chỉ mục là tạo nó dưới dạng một chỉ mục ẩn.
Để thực hiện việc này, hãy sử dụng hidden: true
là một trong những tùy chọn khi bạn tạo chỉ mục.
Ví dụ:
db.pets.createIndex(
{ type: 1 },
{ hidden: true }
)
Đầu ra:
{ "createdCollectionAutomatically" : false, "numIndexesBefore" : 2, "numIndexesAfter" : 3, "ok" : 1 }
Bây giờ chúng ta hãy gọi getIndexes()
một lần nữa để kiểm tra chỉ mục ẩn mới được tạo của chúng tôi:
db.pets.getIndexes()
Kết quả:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "weight" : -1 }, "name" : "idx_weight_-1", "hidden" : true }, { "v" : 2, "hidden" : true, "key" : { "type" : 1 }, "name" : "type_1" } ]
Chúng ta có thể thấy rằng nó đã được tạo bằng "hidden": true
.
Không thể ẩ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.