Generelt kan MongoDB bruge indekspræfikser til at understøtte forespørgsler, men sammensatte indekser inklusive geospatiale felter eller tekstfelter er et specialtilfælde af sparsomme sammensatte indekser . Hvis et dokument ikke indeholder en værdi for nogen af tekstindeksfelterne i et sammensat indeks, vil det ikke blive inkluderet i indekset.
For at sikre korrekte resultater for en præfikssøgning vil en alternativ forespørgselsplan blive valgt frem for det sparsomme sammensatte indeks:
Opsætning af nogle testdata i MongoDB 3.4.5 for at demonstrere det potentielle problem:
db.myCollection.createIndex({ user_id:1, name: 'text' }, { name: 'myIndex'})
// `name` is a string; this document will be included in a text index
db.myCollection.insert({ user_id:123, name:'Banana' })
// `name` is a number; this document will NOT be included in a text index
db.myCollection.insert({ user_id:123, name: 456 })
// `name` is missing; this document will NOT be included in a text index
db.myCollection.insert({ user_id:123 })
Tving derefter det sammensatte tekstindeks til at blive brugt:
db.myCollection.find({user_id:123}).hint('myIndex')
Resultatet inkluderer kun det enkelte dokument med det indekserede tekstfelt name
, snarere end de tre dokumenter, der kunne forventes:
{
"_id": ObjectId("595ab19e799060aee88cb035"),
"user_id": 123,
"name": "Banana"
}
Denne undtagelse bør tydeligere fremhæves i MongoDB-dokumentationen; watch/upvote DOCS-10322 i MongoDB issue tracker for opdateringer.