I allmänhet kan MongoDB använda indexprefix för att stödja frågor, men sammansatta index inklusive geospatiala eller textfält är ett specialfall av glesa sammansatta index . Om ett dokument inte innehåller ett värde för något av textindexfälten i ett sammansatt index, kommer det inte att inkluderas i indexet.
För att säkerställa korrekta resultat för en prefixsökning kommer en alternativ frågeplan att väljas framför det sparsamma sammansatta indexet:
Konfigurera några testdata i MongoDB 3.4.5 för att visa det potentiella problemet:
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 })
Sedan tvingar du det sammansatta textindexet att användas:
db.myCollection.find({user_id:123}).hint('myIndex')
Resultatet inkluderar endast det enskilda dokumentet med det indexerade textfältet name
, snarare än de tre dokument som kan förväntas:
{
"_id": ObjectId("595ab19e799060aee88cb035"),
"user_id": 123,
"name": "Banana"
}
Detta undantag bör tydligare markeras i MongoDB-dokumentationen; titta/rösta upp DOCS-10322 i MongoDB issue tracker för uppdateringar.