MongoDB
Indexes
Zoeken…
Syntaxis
db.collection.createIndex({ <string field> : <1|-1 order> [, <string field> : <1|-1 order>] });
Opmerkingen
Prestatie-impact : houd er rekening mee dat indexen de leesprestaties verbeteren, maar een slechte invloed kunnen hebben op de schrijfprestaties, omdat voor het invoegen van een document alle indexen moeten worden bijgewerkt.
Eén veld
db.people.createIndex({name: 1})
Dit leidt tot een oplopende enkel veld index op de veldnaam.
In dit type indexen is de sorteervolgorde niet relevant, omdat mongo de index in beide richtingen kan doorkruisen.
samenstelling
db.people.createIndex({name: 1, age: -1})
Hiermee maakt u een index op meerdere velden, in dit geval op de name
en age
. Het zal in name
stijgen en in age
dalen.
In dit type index is de sorteervolgorde relevant, omdat deze zal bepalen of de index een sorteerbewerking kan ondersteunen of niet. Omgekeerd sorteren wordt ondersteund op elk voorvoegsel van een samengestelde index, zolang de sortering in omgekeerde sorteerrichting is voor alle toetsen in de sortering. Anders moet het sorteren op samengestelde indexen overeenkomen met de volgorde van de index.
Veldvolgorde is ook belangrijk, in dit geval wordt de index eerst op name
gesorteerd en binnen elke naamwaarde gesorteerd op de waarden van het age
. Hierdoor kan de index te worden gebruikt door queries op de name
het veld of op name
en age
, maar niet op age
alleen.
Delete
Om een index te verwijderen, kunt u de indexnaam gebruiken
db.people.dropIndex("nameIndex")
Of het indexspecificaties document
db.people.dropIndex({name: 1})
Lijst
db.people.getIndexes()
Dit levert een reeks documenten op die elk een index beschrijven van de personenverzameling
Basis voor het maken van indexen
Zie de onderstaande transactiesverzameling.
> 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()
functies tonen alle beschikbare indices voor een verzameling.
db.transactions.getIndexes();
Laten we de uitvoer van bovenstaande instructie bekijken.
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "documentation_db.transactions"
}
]
Er is al één index voor het verzamelen van transacties. Dit komt omdat MongoDB een unieke index op het veld _id
tijdens het maken van een verzameling. De _id
index voorkomt dat clients twee documenten met dezelfde waarde voor het veld _id
. U kunt deze index niet neerzetten op het veld _id
.
Laten we nu een index toevoegen voor het veld cr_dr;
db.transactions.createIndex({ cr_dr : 1 });
Het resultaat van de indexuitvoering is als volgt.
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 1,
"numIndexesAfter" : 2,
"ok" : 1
}
De createCollectionAutomatically geeft aan of de bewerking een verzameling heeft gemaakt. Als er geen verzameling bestaat, maakt MongoDB de verzameling als onderdeel van de indexeringsbewerking.
Laat db.transactions.getIndexes();
nog een keer.
[
{
"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"
}
]
Nu ziet u dat het verzamelen van transacties twee indices heeft. Standaard _id
index en cr_dr_1
die we hebben gemaakt. De naam wordt toegewezen door MongoDB. U kunt uw eigen naam instellen zoals hieronder.
db.transactions.createIndex({ cr_dr : -1 },{name : "index on cr_dr desc"})
Nu db.transactions.getIndexes();
geeft je drie indices.
[
{
"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"
}
]
Tijdens het maken van index { cr_dr : -1 }
1 betekent index in ascending
volgorde en -1 voor descending
volgorde.
Gehashte indexen
Indexen kunnen ook worden gedefinieerd als hashed . Dit presteert beter bij gelijkheidsvragen , maar is niet efficiënt voor bereikquery's ; u kunt echter zowel gehashte als oplopende / aflopende indexen in hetzelfde veld definiëren.
> 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"
}
]
Een index neerzetten / verwijderen
Als de indexnaam bekend is,
db.collection.dropIndex('name_of_index');
Als de indexnaam niet bekend is,
db.collection.dropIndex( { 'name_of_field' : -1 } );
Krijg indices van een verzameling
db.collection.getIndexes();
uitgang
[
{
"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"
}
]
Unieke index
db.collection.createIndex( { "user_id": 1 }, { unique: true } )
uniekheid afdwingen op de gedefinieerde index (enkelvoudig of samengesteld). Het samenstellen van de index zal mislukken als de verzameling al dubbele waarden bevat; de indexering zal ook mislukken wanneer meerdere velden het veld missen (omdat ze allemaal zullen worden geïndexeerd met de waarde null
) tenzij sparse: true
is opgegeven.
Sparse indexen en gedeeltelijke indexen
Sparse indexen:
Deze kunnen met name handig zijn voor velden die optioneel zijn, maar die ook uniek moeten zijn.
{ "_id" : "[email protected]", "nickname" : "Johnnie" }
{ "_id" : "[email protected]" }
{ "_id" : "[email protected]", "nickname" : "Jules"}
{ "_id" : "[email protected]" }
Aangezien voor twee vermeldingen geen "bijnaam" is opgegeven en indexering niet-gespecificeerde velden als nul behandelt, mislukt het maken van de index met 2 documenten met 'null', dus:
db.scores.createIndex( { nickname: 1 } , { unique: true, sparse: true } )
laat je nog steeds 'null' bijnamen hebben.
Dunne indexen zijn compacter omdat ze documenten overslaan / negeren die dat veld niet specificeren. Dus als u een verzameling heeft waarin slechts minder dan 10% van de documenten dit veld specificeert, kunt u veel kleinere indexen maken - beter gebruik maken van beperkt geheugen als u vragen wilt doen zoals:
db.scores.find({'nickname': 'Johnnie'})
Gedeeltelijke indexen:
Gedeeltelijke indexen vertegenwoordigen een superset van de functionaliteit van schaarse indexen en moeten de voorkeur hebben boven schaarse indexen. ( Nieuw in versie 3.2 )
Gedeeltelijke indexen bepalen de indexitems op basis van het opgegeven filter.
db.restaurants.createIndex(
{ cuisine: 1 },
{ partialFilterExpression: { rating: { $gt: 5 } } }
)
Als de rating
hoger is dan 5, wordt de cuisine
geïndexeerd. Ja, we kunnen ook een eigenschap opgeven die moet worden geïndexeerd op basis van de waarde van andere eigenschappen.
Verschil tussen schaarse en gedeeltelijke indexen:
Dunne indexen selecteren documenten om te indexeren uitsluitend op basis van het bestaan van het geïndexeerde veld, of voor samengestelde indexen, het bestaan van de geïndexeerde velden.
Gedeeltelijke indexen bepalen de indexitems op basis van het opgegeven filter. Het filter kan andere velden dan de indexsleutels bevatten en kan andere voorwaarden opgeven dan alleen een bestaancontrole.
Toch kan een gedeeltelijke index hetzelfde gedrag implementeren als een schaarse index
bv:
db.contacts.createIndex(
{ name: 1 },
{ partialFilterExpression: { name: { $exists: true } } }
)
Opmerking: zowel de gedeeltelijke filteroptie- optie als de spaarzame optie kunnen niet tegelijkertijd worden opgegeven.