MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Subdokumentindex in Mongo

Sie können entweder:

> db.collection.ensureIndex({"data.name": 1,"data.age":1, "data.job" : 1})
> db.collection.ensureIndex({"data": 1})

Dies wird in der Dokumentation unter Indizes auf eingebetteten Feldern und Indizes auf Unterdokumenten behandelt

Der wichtige Abschnitt des Unterdokumentabschnitts ist 'Bei der Durchführung von Gleichheitsabgleichen für Unterdokumente ist die Feldreihenfolge wichtig und die Unterdokumente müssen genau übereinstimmen.'

Das bedeutet, dass die beiden Indizes für einfache Abfragen gleich sind.

Wie das Beispiel für Unterdokumente zeigt, können Sie jedoch einige interessante Ergebnisse erhalten (die Sie möglicherweise nicht erwarten), wenn Sie nur das gesamte Unterdokument statt eines bestimmten Felds indizieren und dann einen Vergleichsoperator (wie $gte ) - Wenn Sie ein bestimmtes Unterfeld indizieren, erhalten Sie einen weniger flexiblen, aber möglicherweise nützlicheren Index.

Es hängt wirklich alles von Ihrem Anwendungsfall ab.

Wie auch immer, sobald Sie den Index erstellt haben, können Sie mit :

überprüfen, was erstellt wurde
> db.collection.getIndexes()
[
{
    "v" : 1,
    "key" : {
        "_id" : 1
    },
    "ns" : "test.collection",
    "name" : "_id_"
},
{
    "v" : 1,
    "key" : {
        "data.name" : 1,
        "data.age" : 1,
        "data.job" : 1
    },
    "ns" : "test.collection",
    "name" : "data.name_1_data.age_1_data.job_1"
}

]

Wie Sie der Ausgabe entnehmen können, wurde ein neuer Schlüssel namens data.name_1_data.age_1_data.job_1 erstellt (die _id_ Index wird immer erstellt).

Wenn Sie Ihren neuen Index testen möchten, können Sie Folgendes tun:

> db.collection.insert({data:{name: "A",age:"B", job : "C"}})
> db.collection.insert({data:{name: "A1",age:"B", job : "C"}})
> db.collection.find({"data.name" : "A"}).explain()
{
    "cursor" : "BtreeCursor data.name_1_data.age_1_data.job_1",
     .... more stuff

Hauptsache, Sie sehen, dass Ihr neuer Index verwendet wurde (BtreeCursor data.name_1_data.age_1_data.job_1 im Cursorfeld zeigt dies an). Wenn Sie "cursor" : "BasicCursor" , dann wurde Ihr Index nicht verwendet.

Weitere Informationen finden Sie hier.