MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Risolto il problema con "il nome dell'indice deve essere una stringa" quando si eliminano più indici in MongoDB

Se riscontri l'errore "il nome dell'indice deve essere una stringa" quando elimini più indici in MongoDB, è probabilmente perché stai passando il documento delle specifiche anziché il nome.

Quando usi dropIndexes() metodo o il dropIndexes comando per eliminare più indici, devi passare i nomi dell'indice (non i documenti delle specifiche) in un array.

Indici di esempio

Supponiamo di avere i seguenti indici:

db.posts.getIndexes()

Risultato:

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

Codice problema

Ecco un esempio di codice che causa questo errore:

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

Risultato:

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 questo esempio, sto cercando di eliminare due indici passando i loro documenti di specifica, ma ottengo un errore. Devo invece passare i nomi degli indici.

Soluzione

Per risolvere questo problema, devo semplicemente passare i nomi degli indici invece del loro documento delle specifiche:

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

Risultato:

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

Questo ci dice che gli indici sono stati eliminati correttamente.

Controlla i risultati

Possiamo eseguire getIndexes() nuovamente per verificare che gli indici non esistano più.

db.posts.getIndexes()

Risultato:

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

Entrambi gli indici sono stati eliminati come previsto.