2016-03-21 13 views
1

Versuchen, (mongo) zu sagen, welcher Index verwendet werden soll, wenn bestimmte Abfrageformulare angezeigt werden. Ich könnte dem Cursor einen Hinweis geben, aber das wäre nicht hilfreich, wenn man Aggregate verwendet, die mit einer Matchstufe beginnen.MongoDB "Indexfilter" und "Gefilterte Indizes"

Dafür bietet mongo die Möglichkeit, Abfrageformulare zu "registrieren" und anzugeben, welche Indizes der Abfrageplaner betrachten kann. Hoorah denkt ich: als würde das genau das tun, was ich tun möchte.

ein Belegschema gegeben, das gefällt das aussieht:

db.runCommand(
    { 
     planCacheSetFilter: "testColl", 
     query: { Status : 999, "Domain" : "Y" },  
     indexes: [ { Status : 1 } ] 
    } 
) 

Wenn ich laufen:

{ 
    Domain : "google.com", 
    LocalPart : "james.bond", 
    Status : 5 
} 

und die Indizes: für die Sammlung

{ Status : 1, Domain : 1, LocalPart : 1 } 
{ Status : 1 } 

durch die Registrierung eines Index Filter :

testColl.find({ Status : 5, Domain : "google.com" }).explain() 

Der Gewinnplan verwendet einen Index-Scan des Index:

{ Status : 1 } 

Genau wie erhofft. Das leben ist gut. (Ich weiß es nicht wirklich der beste Index hier, aber das ist der, den ich will)

Aber die Sache ist, Index {Status: 1} ist eigentlich ein "gefilterter Index", der nur "Status = 5" enthält, also ich erneut erklärt der Index zu sein:

{ Status : 1 }, { partialFilterExpression : { Status : 5 } 

Wenn ich die Abfrage erneut ausführen, wird der Gewinnplan ist jetzt ein Sammlung Scan !!!

Ich konnte nirgendwo finden warum oder wie Sie den "Index Filter" nutzen "Filtered Indizes".

Also die Frage wird: ist es möglich? Wenn ja, wie lautet die Syntax?

Danke!

ps: Bitte halten Sie die Antworten auf das Thema "Index Filter" mit "Gefilterte Indizes". Wenn man mir sagt, dass es für das gegebene Beispiel nicht der effizienteste Weg ist, es zu tun, ist es irrelevant, es sei denn, man sieht ein allgemeines Fall- und Sonderfall-goldenes Hammermuster. :)

Antwort

0

Ich denke, man diese Form des Index verwenden soll:

{ Domain : 1 }, { partialFilterExpression : { Status : 5 } } 
Verwandte Themen