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.

2.4

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.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow