MongoDB
indici
Ricerca…
Sintassi
db.collection.createIndex({ <string field> : <1|-1 order> [, <string field> : <1|-1 order>] });
Osservazioni
Impatto sulle prestazioni : si noti che gli indici migliorano le prestazioni di lettura, ma possono avere un impatto negativo sulle prestazioni di scrittura, poiché l'inserimento di un documento richiede l'aggiornamento di tutti gli indici.
Campo singolo
db.people.createIndex({name: 1})
Questo crea un indice di campo singolo crescente sul nome del campo.
In questo tipo di indici l'ordinamento è irrilevante, perché mongo può attraversare l'indice in entrambe le direzioni.
Composto
db.people.createIndex({name: 1, age: -1})
Questo crea un indice su più campi, in questo caso sui campi name
e age
. Sarà ascendente di name
e discendente per age
.
In questo tipo di indice, l'ordinamento è rilevante, poiché determinerà se l'indice può supportare o meno un'operazione di ordinamento. L'ordinamento inverso è supportato su qualsiasi prefisso di un indice composto, purché l'ordinamento sia nella direzione di ordinamento inversa per tutte le chiavi nell'ordinamento. Altrimenti, l'ordinamento per gli indici composti deve corrispondere all'ordine dell'indice.
Anche l'ordine dei campi è importante, in questo caso l'indice verrà ordinato prima per name
e all'interno di ciascun valore del nome, ordinato in base ai valori del campo age
. Ciò consente all'indice di essere utilizzato dalle query sul campo del name
, o sul name
e age
, ma non sulla sola age
.
Elimina
Per eliminare un indice è possibile utilizzare il nome dell'indice
db.people.dropIndex("nameIndex")
O il documento di specifica dell'indice
db.people.dropIndex({name: 1})
Elenco
db.people.getIndexes()
Ciò restituirà una serie di documenti ciascuno descrivendo un indice sulla collezione di persone
Nozioni di base sulla creazione dell'indice
Vedi la raccolta di transazioni di seguito.
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 100, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 10, fee : 2});
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 4});
> db.transactions.insert({ cr_dr : "D", amount : 10, fee : 2});
> db.transactions.insert({ cr_dr : "C", amount : 10, fee : 4});
> db.transactions.insert({ cr_dr : "D", amount : 100, fee : 2});
getIndexes()
funzioni getIndexes()
mostreranno tutti gli indici disponibili per una collezione.
db.transactions.getIndexes();
Vediamo l'output dell'istruzione precedente.
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
}
]
Esiste già un indice per la raccolta delle transazioni. Questo perché MongoDB crea un indice univoco sul campo _id
durante la creazione di una raccolta. L'indice _id
impedisce ai client di inserire due documenti con lo stesso valore per il campo _id
. Non è possibile eliminare questo indice nel campo _id
.
Ora aggiungiamo un indice per il campo cr_dr;
db.transactions.createIndex({ cr_dr : 1 });
Il risultato dell'esecuzione dell'indice è il seguente.
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
Il creatoCollectionAutomatically indica se l'operazione ha creato una raccolta. Se una raccolta non esiste, MongoDB crea la raccolta come parte dell'operazione di indicizzazione.
Lascia correre db.transactions.getIndexes();
ancora.
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
}
]
Ora vedi la raccolta delle transazioni hanno due indici. _id
index e cr_dr_1
che abbiamo creato. Il nome è assegnato da MongoDB. Puoi impostare il tuo nome come di seguito.
db.transactions.createIndex({ cr_dr : -1 },{name : "index on cr_dr desc"})
Ora db.transactions.getIndexes();
ti darò tre indici.
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : -1
},
"name" : "index on cr_dr desc",
"ns" : "documentation_db.transactions"
}
]
Durante la creazione dell'indice { cr_dr : -1 }
1 significa che l'indice sarà in ordine ascending
e -1 per l'ordine descending
.
Indici con hash
Gli indici possono essere definiti anche come hash . Questo è più performante nelle query sull'uguaglianza , ma non è efficiente per le query di intervallo ; tuttavia è possibile definire sia hash che indici ascendenti / discendenti sullo stesso campo.
> db.transactions.createIndex({ cr_dr : "hashed" });
> db.transactions.getIndexes(
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : "hashed"
},
"name" : "cr_dr_hashed",
"ns" : "documentation_db.transactions"
}
]
Eliminazione / eliminazione di un indice
Se il nome dell'indice è noto,
db.collection.dropIndex('name_of_index');
Se il nome dell'indice non è noto,
db.collection.dropIndex( { 'name_of_field' : -1 } );
Ottieni gli indici di una collezione
db.collection.getIndexes();
Produzione
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : 1
},
"name" : "cr_dr_1",
"ns" : "documentation_db.transactions"
},
{
"v" : 1,
"key" : {
"cr_dr" : -1
},
"name" : "index on cr_dr desc",
"ns" : "documentation_db.transactions"
}
]
Indice unico
db.collection.createIndex( { "user_id": 1 }, { unique: true } )
applicare l'unicità sull'indice definito (singolo o composto). La creazione dell'indice fallirà se la raccolta contiene già valori duplicati; l'indicizzazione fallirà anche con più voci che mancano il campo (poiché saranno tutte indicizzate con il valore null
) a meno che sparse: true
sia specificato.
Indici sparsi e indici parziali
Indici sparsi:
Questi possono essere particolarmente utili per i campi che sono facoltativi ma che dovrebbero anche essere unici.
{ "_id" : "[email protected]", "nickname" : "Johnnie" }
{ "_id" : "[email protected]" }
{ "_id" : "[email protected]", "nickname" : "Jules"}
{ "_id" : "[email protected]" }
Poiché due voci non hanno alcun "nickname" specificato e l'indicizzazione tratterà i campi non specificati come null, la creazione dell'indice fallirebbe con 2 documenti che hanno "null", quindi:
db.scores.createIndex( { nickname: 1 } , { unique: true, sparse: true } )
ti permetterà di avere ancora soprannomi 'null'.
Gli indici sparsi sono più compatti poiché ignorano / ignorano i documenti che non specificano quel campo. Quindi, se hai una raccolta in cui solo meno del 10% dei documenti specifica questo campo, puoi creare indici molto più piccoli, facendo un uso migliore della memoria limitata se vuoi fare query come:
db.scores.find({'nickname': 'Johnnie'})
Indici parziali:
Gli indici parziali rappresentano un superset della funzionalità offerta da indici sparsi e dovrebbero essere preferiti su indici sparsi. ( Novità nella versione 3.2 )
Gli indici parziali determinano le voci dell'indice in base al filtro specificato.
db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
Se la rating
è superiore a 5, la cuisine
verrà indicizzata. Sì, possiamo specificare una proprietà da indicizzare in base anche al valore di altre proprietà.
Differenza tra indici sparsi e parziali:
Gli indici sparsi selezionano i documenti da indicizzare esclusivamente in base all'esistenza del campo indicizzato o per gli indici composti, l'esistenza dei campi indicizzati.
Gli indici parziali determinano le voci dell'indice in base al filtro specificato. Il filtro può includere campi diversi dalle chiavi dell'indice e può specificare condizioni diverse da un semplice controllo di esistenza.
Tuttavia, un indice parziale può implementare lo stesso comportamento di un indice sparse
Per esempio:
db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { name: { $exists: true } } }
)
Nota: non è possibile specificare contemporaneamente l'opzione partialFilterExpression e l'opzione sparse .