MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Correction du "nom d'index doit être une chaîne" lors de la suppression de plusieurs index dans MongoDB

Si vous rencontrez l'erreur "le nom d'index doit être une chaîne" lors de la suppression de plusieurs index dans MongoDB, c'est probablement parce que vous transmettez le document de spécifications au lieu du nom.

Lorsque vous utilisez le dropIndexes() ou la méthode dropIndexes commande pour supprimer plusieurs index, vous devez passer l'index noms (pas les documents de spécifications) dans un tableau.

Exemples d'index

Supposons que nous ayons les index suivants :

db.posts.getIndexes()

Résultat :

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

Code du problème

Voici un exemple de code qui provoque cette erreur :

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

Résultat :

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

Dans cet exemple, j'essaie de supprimer deux index en transmettant leurs documents de spécification, mais j'obtiens une erreur. Je dois passer les noms d'index à la place.

Solution

Pour résoudre ce problème, j'ai simplement besoin de passer les noms d'index au lieu de leur document de spécification :

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

Résultat :

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

Cela nous indique que les index ont été supprimés avec succès.

Vérifiez les résultats

Nous pouvons exécuter getIndexes() à nouveau pour vérifier que les index n'existent plus.

db.posts.getIndexes()

Résultat :

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

Les deux index ont été supprimés comme prévu.