MongoDBで複数のインデックスを削除するときに「インデックス名は文字列である必要があります」というエラーが発生した場合は、名前ではなく仕様ドキュメントを渡していることが原因である可能性があります。
dropIndexes()を使用する場合 メソッドまたはdropIndexes 複数のインデックスを削除するコマンドの場合、インデックスの名前を渡す必要があります (仕様書ではありません)アレイ内。
インデックスの例
次のインデックスがあるとします。
db.posts.getIndexes() 結果:
[
{
"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
}
] 問題コード
このエラーの原因となるコードの例を次に示します。
db.posts.dropIndexes( [
{ "_fts" : "text", "_ftsx" : 1 },
{ "title" : 1 }
] ) 結果:
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"
} :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/collection.js:692:11
@(shell):1:1 この例では、仕様書を渡して2つのインデックスを削除しようとしていますが、エラーが発生します。代わりにインデックス名を渡す必要があります。
解決策
この問題を解決するには、仕様書の代わりにインデックス名を渡す必要があります。
db.posts.dropIndexes( [
"body_text",
"title_1"
] ) 結果:
{ "nIndexesWas" : 3, "ok" : 1 } これは、インデックスが正常に削除されたことを示しています。
結果を確認する
getIndexes()を実行できます もう一度、インデックスが存在しないことを確認します。
db.posts.getIndexes() 結果:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ] 両方のインデックスが期待どおりに削除されました。