2011-12-22 18 views
17

Non sono sicuro di capire correttamente gli indici sparsi.indici sparsi e valori nulli in mongo

Ho un indice univoco sparse sul fbId

{ 
    "ns" : "mydb.users", 
    "key" : { 
     "fbId" : 1 
    }, 
    "name" : "fbId_1", 
    "unique" : true, 
    "sparse" : true, 
    "background" : false, 
    "v" : 0 
} 

e mi aspettavo che mi avrebbe permesso di inserire i record con NULL come fbId, ma che genera un'eccezione di chiave duplicata. Mi consente di inserire solo se la proprietà fbId è stata rimossa completamente.

Non è un indice raro che si suppone debba occuparsene?

risposta

31

Gli indici sparsi non contengono documenti che mancano di campo indicizzato. Tuttavia, se il campo esiste e ha il valore di null, verrà comunque indicizzato. Quindi, se l'assenza del campo e la sua uguaglianza a null sembrano uguali per l'applicazione e si desidera mantenere l'unicità di fbId, basta non inserirlo finché non si dispone di un valore per esso.

È necessario disporre di indici sparsi quando si dispone di un numero elevato di documenti, ma solo una piccola parte di essi contiene un campo e si desidera poter trovare rapidamente i documenti in tale campo. Creare un indice normale sarebbe troppo costoso, sprecheresti solo RAM preziosa sui documenti di indicizzazione a cui non sei interessato.

1

Per garantire il massimo rendimento degli indici, potremmo voler omettere dall'indicizzazione di quei documenti che NON contengono il campo su cui stai eseguendo un indice. Per fare questo MongoDB ha la proprietà sparse che funziona come segue:

db.addresses.ensureIndex({ "secondAddress": 1 }, { sparse: true }); 

Questo indice si omette tutti i documenti che non contengono il campo secondAddress e durante l'esecuzione di una query, quelli documento non sarà mai sottoposti a scansione.

Vorrei condividere questo articolo su indici di base e alcune delle loro proprietà:

geospaziali, Testo, indici hash e le proprietà uniche e sparse: http://mongodbspain.com/en/2014/02/03/mongodb-indexes-part-2-geospatial-2d-2dsphere/

1

{a:1, b:5, c:2} 
{a:8, b:15, c:7} 
{a:4, b:7} 
{a:3, b:10} 

Supponiamo che vogliamo creare un indice sui documenti di cui sopra. La creazione dell'indice su a & b non sarà un problema. Ma cosa succede se abbiamo bisogno di creare un indice su c. Il vincolo univoco non funzionerà per le chiavi c poiché il valore nullo è duplicato per 2 documenti. La soluzione in questo caso è utilizzare l'opzione sparse. Questa opzione dice al database di non includere i documenti che non hanno la chiave. Il comando in questione è db.collectionName.createIndex({thing:1}, {unique:true, sparse:true}). L'indice sparse ci consente di utilizzare anche meno spazio.

Si noti che anche se si dispone di un indice sparse, il database esegue la scansione di tutti i documenti, in particolare quando si esegue l'ordinamento. Questo può essere visto nel risultato piano del piano explain.