2011-03-15 23 views
10

Ho letto da qualche parte che la chiamata ensureIndex() crea effettivamente una raccolta se non esiste. Ma l'indice è sempre su alcuni campi, non su tutti, quindi se assicuro un indice su { name:1 } e poi aggiungo documenti a quella raccolta che hanno molti più campi, l'indice funzionerà? So che non abbiamo uno schema, proveniente dal mondo RDBMS, voglio solo essere sicuro. :) Mi piacerebbe creare indici quando il mio sito web inizia, ma inizialmente il database è vuoto. Non ho bisogno di avere dati prima di garantire gli indici, è corretto?Va bene chiamare sureIndex su raccolte inesistenti?

risposta

9

ensureIndex creerà la raccolta se non esiste ancora. Non importa se aggiungi documenti che non hanno la proprietà coperta dall'indice, non puoi semplicemente usare quell'indice per trovare quei documenti. Il modo in cui ho capito è che nelle versioni precedenti alla 1.7.4 un documento che manca una proprietà per la quale esiste un indice verrà indicizzato come se avesse quella proprietà, ma avrà un valore nullo. Nelle versioni successive alla 1.7.4 è possibile creare indici sparsi che non includono affatto questi oggetti. La differenza è lieve ma potrebbe essere significativa in alcune situazioni.

A seconda delle circostanze, potrebbe non essere una buona idea creare indici quando viene avviata l'app. Si consideri la situazione in cui si distribuisce una nuova versione che aggiunge nuovi indici all'avvio, in fase di sviluppo non si noterà questo dato che si dispone solo di un piccolo database, ma in produzione si può avere un enorme database e l'aggiunta richiederà molto tempo di tempo. Durante la creazione dell'indice la tua app si bloccherà e non potrai servire le richieste. È possibile creare indici con il flag di sfondo impostato su true (la sintassi dipende dal driver che si sta utilizzando), ma nella maggior parte dei casi è preferibile aggiungere gli indici manualmente o come parte di uno script di installazione. In questo modo dovrai pensare prima di aggiornare gli indici.

+0

Sto utilizzando ASP.NET MVC e il driver C# in modo specifico, ma ritengo che la questione sia indipendente dalla tecnologia. Non ho pensato di inserire le chiamate di indicizzazione nel mio script di compilazione, tuttavia, il che sembra interessante, ho bisogno di scoprire come chiamare 'ensureIndex' dalla riga di comando. –

+0

Penso che dovrebbe essere possibile chiamare 'ensureIndex' da uno script JS caricato attraverso la shell mongo. –

+0

È possibile eseguire un file JavaScript con 'mongo nome_db script.js'. Quel file può contenere molte cose che puoi digitare nella console di Mongo. – Theo