sql >> Databasteknik >  >> NoSQL >> MongoDB

Fixa "indexnamn måste vara en sträng" när du släpper flera index i MongoDB

Om du stöter på felet "indexnamn måste vara en sträng" när du släpper flera index i MongoDB, beror det förmodligen på att du skickar specifikationsdokumentet istället för namnet.

När du använder dropIndexes() metoden eller dropIndexes kommandot för att ta bort flera index måste du skicka indexet namn (inte specifikationsdokumenten) i en array.

Exempelindex

Anta att vi har följande index:

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
	}
]

Problemkod

Här är ett exempel på kod som orsakar detta fel:

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 det här exemplet försöker jag ta bort två index genom att skicka deras specifikationsdokument, men jag får ett fel. Jag måste skicka indexnamnen istället.

Lösning

För att lösa det här problemet behöver jag bara skicka indexnamnen istället för deras specifikationsdokument:

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

Resultat:

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

Det säger oss att indexen släpptes framgångsrikt.

Kontrollera resultaten

Vi kan köra getIndexes() igen för att verifiera att indexen inte längre finns.

db.posts.getIndexes()

Resultat:

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

Båda indexen har tappats som förväntat.


  1. MongoDB bind_ip fungerar inte om den inte är inställd på 0.0.0.0

  2. Hur drar man en instans av ett objekt i en array i MongoDB?

  3. Hur kontrollerar man om ett arrayfält innehåller ett unikt värde eller en annan array i MongoDB?

  4. Hur man stoppar infogning av dubbletter av dokument i en mongodb-samling