MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Fix „Indexname muss ein String sein“ beim Löschen mehrerer Indizes in MongoDB

Wenn beim Löschen mehrerer Indizes in MongoDB der Fehler „Indexname muss eine Zeichenfolge sein“ auftritt, liegt dies wahrscheinlich daran, dass Sie das Spezifikationsdokument anstelle des Namens übergeben.

Wenn Sie dropIndexes() verwenden -Methode oder die dropIndexes Um mehrere Indizes zu löschen, müssen Sie den Index names übergeben (nicht die Spezifikationsdokumente) in einem Array.

Beispielindizes

Angenommen, wir haben die folgenden Indizes:

db.posts.getIndexes()

Ergebnis:

[
	{
		"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
	}
]

Problemcode

Hier ist ein Codebeispiel, das diesen Fehler verursacht:

db.posts.dropIndexes( [ 
  { "_fts" : "text", "_ftsx" : 1 }, 
  { "title" : 1 } 
] )

Ergebnis:

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

In diesem Beispiel versuche ich, zwei Indizes zu löschen, indem ich ihre Spezifikationsdokumente übergebe, aber ich erhalte eine Fehlermeldung. Ich muss stattdessen die Indexnamen übergeben.

Lösung

Um dieses Problem zu beheben, muss ich einfach die Indexnamen anstelle ihres Spezifikationsdokuments übergeben:

db.posts.dropIndexes( [ 
  "body_text", 
  "title_1" 
] )

Ergebnis:

{ "nIndexesWas" : 3, "ok" : 1 }

Das sagt uns, dass die Indizes erfolgreich gelöscht wurden.

Überprüfen Sie die Ergebnisse

Wir können getIndexes() ausführen erneut, um zu überprüfen, ob die Indizes nicht mehr existieren.

db.posts.getIndexes()

Ergebnis:

[ { "v" : 2, "key" : { "_id" : 1 }, "name" : "_id_" } ]

Beide Indizes wurden wie erwartet gelöscht.