Suche…


Syntax

  • db.collection.createIndex({ <string field> : <1|-1 order> [, <string field> : <1|-1 order>] });

Bemerkungen

Performance Auswirkungen: Beachten Sie, dass Indizes Lese Leistungen zu verbessern, kann aber schlechte Auswirkungen auf die Schreibleistung haben, wie das Einfügen eines Dokuments verlangt , dass alle Indizes zu aktualisieren.

Einzelfeld

db.people.createIndex({name: 1})

Dadurch entsteht eine aufsteigende einzelnes Feld Index auf den Feldnamen.

Bei dieser Art von Indizes ist die Sortierreihenfolge irrelevant, da Mongo den Index in beide Richtungen durchlaufen kann.

Verbindung

db.people.createIndex({name: 1, age: -1})

Dadurch wird ein Index für mehrere Felder erstellt, in diesem Fall für die Felder name und age . Es wird im name aufsteigend und im age absteigend.

Bei diesem Indextyp ist die Sortierreihenfolge relevant, da er bestimmt, ob der Index eine Sortieroperation unterstützen kann oder nicht. Die umgekehrte Sortierung wird für jedes Präfix eines zusammengesetzten Index unterstützt, sofern die Sortierung in umgekehrter Sortierrichtung für alle Schlüssel in der Sortierung erfolgt. Andernfalls muss die Sortierung nach zusammengesetzten Indizes mit der Reihenfolge des Index übereinstimmen.

Die Reihenfolge der Felder ist ebenfalls wichtig. In diesem Fall wird der Index zuerst nach name und innerhalb jedes Namenswerts nach den Werten des Felds age sortiert. Dies ermöglicht es der Index von Abfragen auf dem zu verwendenden name Feld oder auf name und age , aber nicht auf age allein.

Löschen

Um einen Index zu löschen, können Sie den Indexnamen verwenden

db.people.dropIndex("nameIndex")

Oder das Indexspezifikationsdokument

db.people.dropIndex({name: 1})

Liste

db.people.getIndexes()

Dadurch wird ein Array von Dokumenten zurückgegeben, die jeweils einen Index der Personensammlung beschreiben

Grundlagen zur Indexerstellung

Siehe die untenstehende Transaktionssammlung.

> 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() Funktionen zeigen alle für eine Collection verfügbaren Indizes an.

db.transactions.getIndexes();

Lassen Sie die Ausgabe der obigen Anweisung sehen.

[
    {
        "v" : 1,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "documentation_db.transactions"
    }
]

Es gibt bereits einen Index für die Transaktionserfassung. Dies liegt daran, dass MongoDB während der Erstellung einer Sammlung einen eindeutigen Index für das Feld _id . Der _id Index verhindert, dass Clients zwei Dokumente mit demselben Wert für das _id Feld _id . Sie können diesen Index nicht im Feld _id .

Nun fügen wir einen Index für das cr_dr-Feld hinzu.

db.transactions.createIndex({ cr_dr : 1 });

Das Ergebnis der Indexausführung lautet wie folgt.

{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

Die createdCollectionAutomatically gibt an, ob der Vorgang eine Auflistung erstellt hat. Wenn keine Sammlung vorhanden ist, erstellt MongoDB die Sammlung als Teil des Indexierungsvorgangs.

Lassen Sie db.transactions.getIndexes(); nochmal.

[
    {
        "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"
    }
]

Jetzt sehen Sie, dass die Transaktionssammlung zwei Indizes hat. Standard- _id Index und cr_dr_1 die wir erstellt haben. Der Name wird von MongoDB vergeben. Sie können Ihren eigenen Namen wie folgt festlegen.

db.transactions.createIndex({ cr_dr : -1 },{name : "index on cr_dr desc"})

Jetzt db.transactions.getIndexes(); gibt Ihnen drei Indizes.

[
    {
        "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"
    }
]

Beim Erstellen des Index { cr_dr : -1 } 1 wird der Index in ascending Reihenfolge und -1 in descending Reihenfolge { cr_dr : -1 } .

2.4

Hash-Indizes

Indizes können auch als Hash definiert werden. Dies ist bei Gleichheitsabfragen performanter, bei Bereichsabfragen jedoch nicht effizient. Sie können jedoch sowohl gehashte als auch aufsteigende / absteigende Indizes für dasselbe Feld definieren.

> 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"
    }
]

Index löschen / löschen

Wenn der Indexname bekannt ist,

db.collection.dropIndex('name_of_index');

Wenn der Indexname nicht bekannt ist,

db.collection.dropIndex( { 'name_of_field' : -1 } );

Holen Sie sich Indizes einer Sammlung

 db.collection.getIndexes();

Ausgabe

[
    {
        "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"
    }
]

Eindeutiger Index

db.collection.createIndex( { "user_id": 1 }, { unique: true } )

Eindeutigkeit für den definierten Index erzwingen (entweder einzeln oder zusammengesetzt). Das Erstellen des Index schlägt fehl, wenn die Sammlung bereits doppelte Werte enthält. Die Indizierung schlägt auch fehl, wenn das Feld bei mehreren Einträgen fehlt (da sie alle mit dem Wert null indiziert werden), sofern nicht sparse: true angegeben ist.

Sparse-Indizes und Teilindizes

Sparse-Indizes:

Dies kann besonders nützlich für Felder sein, die optional sind, aber auch eindeutig sein sollten.

{ "_id" : "[email protected]", "nickname" : "Johnnie" }
{ "_id" : "[email protected]" }
{ "_id" : "[email protected]", "nickname" : "Jules"}
{ "_id" : "[email protected]" }

Da für zwei Einträge kein "Kurzname" angegeben ist und die Indexierung nicht festgelegte Felder als Nullwert behandelt, schlägt die Indexerstellung mit zwei Dokumenten mit "Nullwert" fehl.

db.scores.createIndex( { nickname: 1 } , { unique: true, sparse: true } )

werden Sie immer noch 'null' Spitznamen haben.

Sparse-Indizes sind kompakter, da sie Dokumente überspringen / ignorieren, in denen dieses Feld nicht angegeben ist. Wenn Sie also über eine Sammlung verfügen, in der nur weniger als 10% der Dokumente dieses Feld angeben, können Sie wesentlich kleinere Indizes erstellen. So können Sie den begrenzten Speicher besser nutzen, wenn Sie Abfragen wie:

db.scores.find({'nickname': 'Johnnie'})

Teilindizes:

Teilindizes stellen eine Obermenge der von Sparse-Indizes gebotenen Funktionalität dar und sollten gegenüber Sparse-Indizes bevorzugt werden. ( Neu in Version 3.2 )

Teilindizes bestimmen die Indexeinträge basierend auf dem angegebenen Filter.

db.restaurants.createIndex(
  { cuisine: 1 },
  { partialFilterExpression: { rating: { $gt: 5 } } }
)

Ist die rating größer als 5, wird die cuisine indexiert. Ja, wir können auch eine Eigenschaft angeben, die basierend auf dem Wert anderer Eigenschaften indiziert werden soll.

Unterschied zwischen Sparse- und Teilindizes:

Sparse-Indizes wählen die zu indizierenden Dokumente ausschließlich auf der Grundlage des Vorhandenseins des indizierten Feldes oder bei zusammengesetzten Indizes das Vorhandensein der indizierten Felder aus.

Teilindizes bestimmen die Indexeinträge basierend auf dem angegebenen Filter. Der Filter kann andere Felder als die Indexschlüssel enthalten und kann andere Bedingungen als nur eine Existenzprüfung angeben.

Ein Teilindex kann jedoch dasselbe Verhalten wie ein Index mit geringer Dichte implementieren

Z.B:

db.contacts.createIndex(
   { name: 1 },
   { partialFilterExpression: { name: { $exists: true } } }
)

Anmerkung: Die Option partialFilterExpression und die Option " Sparse " können nicht gleichzeitig angegeben werden.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow