Nếu bạn gặp lỗi "tên chỉ mục phải là một chuỗi" khi bỏ nhiều chỉ mục trong MongoDB, thì có thể là do bạn đang chuyển tài liệu thông số kỹ thuật thay vì tên.
Khi bạn sử dụng dropIndexes()
hoặc dropIndexes
lệnh để thả nhiều chỉ mục, bạn cần chuyển các chỉ mục tên (không phải tài liệu thông số kỹ thuật) trong một mảng.
Chỉ mục mẫu
Giả sử chúng ta có các chỉ mục sau:
db.posts.getIndexes()
Kết quả:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" }, { "v" : 2, "key" : { "title" : 1 }, "name" : "title_1" }, { "v" : 2, "key" : { "_fts" : "text", "_ftsx" : 1 }, "name" : "body_text", "weights" : { "body" : 1 }, "default_language" : "english", "language_override" : "language", "textIndexVersion" : 3 } ]
Mã sự cố
Dưới đây là một ví dụ về mã gây ra lỗi này:
db.posts.dropIndexes( [
{ "_fts" : "text", "_ftsx" : 1 },
{ "title" : 1 }
] )
Kết quả:
uncaught exception: Error: error dropping indexes : { "ok" : 0, "errmsg" : "dropIndexes krankykranes.posts (f9083c2c-8291-49d1-95f7-40711186db98) failed to drop multiple indexes [ { _fts: \"text\", _ftsx: 1.0 }, { title: 1.0 } ]: index name must be a string", "code" : 14, "codeName" : "TypeMismatch" } : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/collection.js:692:11 @(shell):1:1
Trong ví dụ này, tôi đang cố gắng xóa hai chỉ mục bằng cách chuyển các tài liệu đặc tả của chúng, nhưng tôi gặp lỗi. Thay vào đó, tôi cần chuyển các tên chỉ mục.
Giải pháp
Để khắc phục sự cố này, tôi chỉ cần chuyển các tên chỉ mục thay vì tài liệu đặc tả của chúng:
db.posts.dropIndexes( [
"body_text",
"title_1"
] )
Kết quả:
{ "nIndexesWas" : 3, "ok" : 1 }
Điều đó cho chúng tôi biết rằng các chỉ mục đã bị loại bỏ thành công.
Kiểm tra kết quả
Chúng ta có thể chạy getIndexes()
một lần nữa để xác minh rằng các chỉ mục không còn tồn tại.
db.posts.getIndexes()
Kết quả:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]
Cả hai chỉ mục đã bị giảm như mong đợi.