Jika Anda menemukan kesalahan “nama indeks harus berupa string” saat menjatuhkan beberapa indeks di MongoDB, itu mungkin karena Anda meneruskan dokumen spesifikasi alih-alih namanya.
Saat Anda menggunakan dropIndexes()
metode atau dropIndexes
perintah untuk menjatuhkan beberapa indeks, Anda harus melewati nama indeks (bukan dokumen spesifikasi) dalam larik.
Contoh Indeks
Misalkan kita memiliki indeks berikut:
db.posts.getIndexes()
Hasil:
[ { "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 } ]
Kode Masalah
Berikut contoh kode yang menyebabkan kesalahan ini:
db.posts.dropIndexes( [
{ "_fts" : "text", "_ftsx" : 1 },
{ "title" : 1 }
] )
Hasil:
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
Dalam contoh ini, saya mencoba menghapus dua indeks dengan meneruskan dokumen spesifikasinya, tetapi saya mendapatkan kesalahan. Saya harus memberikan nama indeks sebagai gantinya.
Solusi
Untuk memperbaiki masalah ini, saya hanya perlu memberikan nama indeks alih-alih dokumen spesifikasinya:
db.posts.dropIndexes( [
"body_text",
"title_1"
] )
Hasil:
{ "nIndexesWas" : 3, "ok" : 1 }
Itu memberitahu kita bahwa indeks berhasil dijatuhkan.
Periksa Hasil
Kita dapat menjalankan getIndexes()
sekali lagi untuk memverifikasi bahwa indeks tidak lagi ada.
db.posts.getIndexes()
Hasil:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]
Kedua indeks telah dijatuhkan seperti yang diharapkan.