2016-01-26 23 views
16

Esiste un comando che posso utilizzare tramite javascript nella shell mongo che può essere utilizzato per verificare se il particolare indice esiste nel mio mongodb. Sto costruendo un file di script che creerebbe gli indici. Mi piacerebbe che se eseguo questo file più volte, gli indici già esistenti non vengono ricreati.Controllare se esiste un indice in mongodb

Posso usare db.collection.getIndexes() per ottenere la raccolta di tutti gli indici nel mio db e quindi creare una logica per ignorare quelli già esistenti ma mi chiedevo se c'è un comando per ottenere un indice e quindi ignora uno script che crea l'indice. Qualcosa di simile:

If !exists(db.collection.exists("indexname")) 
{ 
    create db.collectionName.CreateIndex("IndexName") 
} 
+4

chiamata 'createIndex' quando l'indice esiste già è un no-op, quindi non c'è davvero alcun bisogno di controllare. – JohnnyHK

+1

Possibile duplicato di [ensureIndex in mongodb] (http://stackoverflow.com/questions/12547526/ensureindex-in-mongodb) – BatScream

risposta

25

Creazione di indici in MongoDB è un'operazione idempotente. Quindi l'esecuzione di db.names.createIndex({name:1}) creerebbe l'indice solo se non esisteva già.

Il obsoleta (come MongoDB 3.0) alias per createIndex() è ensureIndex() che è un po 'più chiaro su ciò createIndex() fa effettivamente.


Edit: Grazie a Zitro per chiarire nei commenti che chiamare createIndex() con lo stesso nome ma le opzioni diverse da un indice esistente genera un errore MongoError: Index with name: **indexName** already exists with different options come spiegato nel this question.


Se avete altre ragioni per il controllo, allora si può accedere ai dati dell'indice corrente uno dei due modi:

  1. Come di v3.0, possiamo usare db.names.getIndexes() dove names è il nome del collezione. Docs here.
  2. Prima della versione 3.0, è possibile accedere alla raccolta system.indexes e fare un find come bri describes below.
+1

Nota che potremmo prendere l'errore "MongoError: Index con nome: ** indexName ** con diverse opzioni" facendo semplicemente 'createIndex'. Quindi usare 'db.collection.getIndexes()' ha senso a volte. Vedi [questa domanda] (http://stackoverflow.com/q/30232081/2590150) per maggiori informazioni. – ZitRo

+0

Questa risposta è sorprendente. Sono venuto qui perché 'createIndex' sta prendendo più di 30 secondi su ogni avvio del mio server (mongo 2.6). Sicuramente non ci vorrà molto per confermare se l'indice esiste o no? – Thor84no

+0

@ Thor84no 2.6 non usa 'createIndex', usa' ensureIndex' https://docs.mongodb.com/v2.6/core/index-creation/ – metame

12

Utilizzare db.system.indexes e cercare su di esso.

Se, ad esempio, avete un indice chiamato 'indexname', è possibile cercare in questo modo:

db.system.indexes.find({'name':'indexname'}); 

Se avete bisogno di cercare per questo indice su una raccolta specifica, allora avete bisogno di usa la proprietà ns (e, sarebbe utile avere il nome db).

db.system.indexes.find({'name':'indexname', 'ns':'dbname.collection'}); 

O, se assolutamente odio compreso il nome del db ...

db.system.indexes.find({'name':'indexname', 'ns': {$regex:'.collection$'}}); 

Tirando che insieme ...

Così, sei finito assegno sarebbe:

if(db.system.indexes.find({name:'indexname',ns:{$regex:'.collection$'}}).count()==0) { 
    db.collection.createIndex({blah:1},{name:'indexname'}) 
} 
+0

Funziona su versione 3.4. Ho provato ma non restituisce nulla sulla console. –

+0

@SohamShetty Questo è stato deprecato dalla versione 3.0. Ora dovresti usare 'db.name.getIndexes()' dove 'name' è il nome della tua raccolta. – metame

Problemi correlati