Over het algemeen kan MongoDB indexvoorvoegsels gebruiken om zoekopdrachten te ondersteunen, maar samengestelde indexen, inclusief geospatiale of tekstvelden, zijn een speciaal geval van sparse samengestelde indexen . Als een document geen waarde bevat voor een van de tekstindexvelden in een samengestelde index, wordt het niet in de index opgenomen.
Om ervoor te zorgen dat juiste resultaten voor een prefix-zoekopdracht wordt een alternatief zoekplan gekozen boven de schaarse samengestelde index:
Enkele testgegevens instellen in MongoDB 3.4.5 om het potentiële probleem aan te tonen:
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 })
Dan dwingen de samengestelde tekstindex te gebruiken:
db.myCollection.find({user_id:123}).hint('myIndex')
Het resultaat bevat alleen het enkele document met het geïndexeerde tekstveld name
, in plaats van de drie documenten die je zou verwachten:
{
"_id": ObjectId("595ab19e799060aee88cb035"),
"user_id": 123,
"name": "Banana"
}
Deze uitzondering moet duidelijker worden benadrukt in de MongoDB-documentatie; watch/upvote DOCS-10322 in de MongoDB issue tracker voor updates.