По принцип MongoDB може да използва индексни префикси за поддръжка на заявки, но съставните индекси, включително геопространствени или текстови полета, са специален случай на редки съставни индекси . Ако даден документ не включва стойност за някое поле(я) на текстов индекс в съставен индекс, той няма да бъде включен в индекса.
За да осигурите правилни резултати за префиксно търсене ще бъде избран алтернативен план на заявка вместо рядък съставен индекс:
Настройване на някои тестови данни в MongoDB 3.4.5 за демонстриране на потенциалния проблем:
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 })
След това принуждавайки използването на съставния текстов индекс:
db.myCollection.find({user_id:123}).hint('myIndex')
Резултатът включва само един документ с индексираното текстово поле name
, а не трите документа, които биха се очаквали:
{
"_id": ObjectId("595ab19e799060aee88cb035"),
"user_id": 123,
"name": "Banana"
}
Това изключение трябва да бъде по-ясно подчертано в документацията на MongoDB; гледане/гласуване за DOCS-10322 в програмата за проследяване на проблеми MongoDB за актуализации.