Hvis du støder på fejlen "indeksnavn skal være en streng", når du dropper flere indekser i MongoDB, er det sandsynligvis fordi du sender specifikationsdokumentet i stedet for navnet.
Når du bruger dropIndexes()
metoden eller dropIndexes
kommando for at slette flere indekser, skal du sende indekset navne (ikke specifikationsdokumenterne) i et array.
Eksempler på indekser
Antag, at vi har følgende indekser:
db.posts.getIndexes()
Resultat:
[ { "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 } ]
Problemkode
Her er et eksempel på kode, der forårsager denne fejl:
db.posts.dropIndexes( [
{ "_fts" : "text", "_ftsx" : 1 },
{ "title" : 1 }
] )
Resultat:
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
I dette eksempel forsøger jeg at slette to indekser ved at sende deres specifikationsdokumenter, men jeg får en fejl. Jeg skal videregive indeksnavnene i stedet.
Løsning
For at løse dette problem skal jeg blot sende indeksnavnene i stedet for deres specifikationsdokument:
db.posts.dropIndexes( [
"body_text",
"title_1"
] )
Resultat:
{ "nIndexesWas" : 3, "ok" : 1 }
Det fortæller os, at indekserne blev slettet med succes.
Tjek resultaterne
Vi kan køre getIndexes()
igen for at bekræfte, at indekserne ikke længere eksisterer.
db.posts.getIndexes()
Resultat:
[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]
Begge indekser er blevet droppet som forventet.