Ogólnie MongoDB może używać prefiksów indeksów do obsługi zapytań, jednak indeksy złożone, w tym pola geoprzestrzenne lub tekstowe, są szczególnym przypadkiem rzadkie indeksy złożone . Jeśli dokument nie zawiera wartości dla żadnego z pól indeksu tekstowego w indeksie złożonym, nie zostanie on uwzględniony w indeksie.
Aby zapewnić poprawne wyniki dla wyszukiwania prefiksu, alternatywny plan zapytania zostanie wybrany przez rzadki indeks złożony:
Konfigurowanie niektórych danych testowych w MongoDB 3.4.5, aby zademonstrować potencjalny 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 })
Następnie wymuszając użycie złożonego indeksu tekstowego:
db.myCollection.find({user_id:123}).hint('myIndex')
Wynik zawiera tylko pojedynczy dokument z indeksowanym polem tekstowym name
, a nie trzy dokumenty, których można by się spodziewać:
{
"_id": ObjectId("595ab19e799060aee88cb035"),
"user_id": 123,
"name": "Banana"
}
Ten wyjątek powinien być wyraźniej podkreślony w dokumentacji MongoDB; oglądaj/zagłosuj DOCS-10322 w narzędziu do śledzenia problemów MongoDB w celu uzyskania aktualizacji.