2013-05-27 5 views
32

Was passiert genau, wenn ich ensureIndex(data) anrufe, wenn typische Daten wie data:{name: "A",age:"B", job : "C"} aussehen? Wird es über diese drei Felder einen zusammengesetzten Index erstellen oder wird nur ein Index erstellt, wenn etwas aus Daten angefordert wird oder etwas ganz anderes?Subdocument index in mongo

+1

Es ist einfach zu überprüfen. Erstellen Sie einfach eine Testsammlung und starten Sie einige Abfragen mit '.explain()'. Das würde ich tun. Ich bin mir nicht sicher, was Mongo tun wird. –

Antwort

41

können Sie tun entweder:

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

Dies wird in der Dokumentation unter indexes-on-embedded-fields diskutiert und indexes on sub documents

Der wichtige Abschnitt des Unterdokumentabschnitt ist ‚Bei der Durchführung von Gleichheit auf Subdokumente einstimmt, Feldreihenfolge Dinge und die Filialdokumente müssen genau übereinstimmen.

Dies bedeutet, dass die 2 Indizes für einfache Abfragen identisch sind.

Wie das Beispiel des Unterdokuments zeigt, können Sie einige interessante Ergebnisse erhalten (die Sie vielleicht nicht erwarten würden), wenn Sie nur das ganze Unterdokument im Gegensatz zu einem bestimmten Feld 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, wenn Sie den Index erstellt haben, was mit erstellt wird überprüfen:

> 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 aus der Ausgabe sehen kann einen neuen Schlüssel data.name_1_data.age_1_data.job_1 genannt erstellt (der _id_ Index immer erstellt).

Wenn Sie Ihren neuen Index testen möchten, dann können Sie 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 

Die Hauptsache ist, dass Sie, dass Ihr neuer Index verwendet wurde, sehen (BtreeCursor data.name_1_data.age_1_data.job_1 in das Cursorfeld zeigt an, dass dies der Fall ist). Wenn Sie "cursor" : "BasicCursor" sehen, wurde Ihr Index nicht verwendet.

Weitere Informationen finden Sie unter here.

-1

Sie können dies versuchen:

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

Dies beantwortet nicht die Frage, nämlich was das Ergebnis davon ist. – Christophe