2017-07-05 5 views
2

Ich stehe vor einem seltsamen Problem. Ich habe einen teilweise, Verbindung, einzigartigen Index mit defination:Mongo Partial Compound Eindeutiger Index | Nicht verwendet in Abfrage

createIndex({a: 1, b:1, c: 1}, {unique:1, partialFilterExpression: {c: {$type: "string"}}})

Nun, wenn ich eine Abfrage dieses Index führe niemals gemäß dem Plan erklärt verwendet wird. Auch wenn Dokumente mit der Abfrage übereinstimmen.

chaning gleichen Index anstelle von Teil-Fixes des oben genannte Problem spärlich, aber spärlich, Verbindung, einzigartige Indizes haben folgendes Problem: dealing-with-mongodb-unique-sparse-compound-indexes

Index Is Properly Created

Query returns a document

Index is not Used

+0

Nun, wenn es nur ein Element in der Sammlung kaum überraschend ist dies. Das Atlas-Tool ist wahrscheinlich nicht der beste Ort, um trotzdem zu suchen. Stattdessen sollten Sie das vollständige Ergebnis in der Shell mit '.explain (true)' betrachten. Dies wird wahrscheinlich zeigen, dass obwohl der Index "betrachtet" wurde, er zugunsten eines Sammlungsscans für das einzelne Ergebnis verworfen wurde. –

+0

Tatsächlich gibt es mehrere Elemente in Sammlungen. Wie Sie Dokumente überprüfen können: 5. Dies gilt auch für größere Sammlungen. – Taha

+1

Denkst du, du könntest dann ein "vollständigeres" Beispiel zeigen? Und wenn Sie gerade dabei sind, verwenden Sie bitte die 'mongo'-Shell und fügen Sie anstelle von Bildern die Ausgabe" text "ein. Es ist wirklich schwierig, Bilder in einem Post zu lesen, wenn "Text" so viel klarer ist, und wir können alle Daten kopieren und einfügen und ausgeben. Was Sie sonst nicht mit Bildern machen können. –

Antwort

1

Wie in der query coverage Dokumentation erwähnt r Teilindizes:

MongoDB wird den partiellen Index nicht für eine Abfrage oder Sortieroperation verwenden, wenn der Index zu einer unvollständigen Ergebnismenge führt.

Um den partiellen Index zu verwenden, muss eine Abfrage den Filterausdruck (oder einen geänderten Filterausdruck, der eine Teilmenge des Filterausdrucks angibt) als Teil seiner Abfragebedingung enthalten.

In Ihrer Einrichtung erstellen Sie eine partielle Indexfilterung auf {c: {$type: "string"}}.

Ihre Abfragebedingungen lauten {a:"1", b:"p", c:"2"} oder eine Abfrageform von drei Gleichheitsvergleichen ({a: eq, b: eq, c: eq}). Da diese Abfrageform keinen $type Filter unter c enthält, muss die query planner berücksichtigen, dass Abfragen, die die Form anpassen, mit Werten eines beliebigen Datentyps übereinstimmen sollten und der partielle Index kein praktikabler Kandidat für vollständige Ergebnisse ist.

Einige Beispielabfragen, die Ihren Teil-Index (getestet mit MongoDB 3.4.5) verwenden würden:

// Search on {a, b} with c criteria matching the index filter 
db.mydb.find({a:"1", b:"p", c: { $type: "string" } }) 

// Search on {a,b,c} and use $and to include the type of c 
db.mydb.find({a:"1", b:"p", $and: [{ c: "2"} , {c: { $type: "string" }}]})