En général, MongoDB peut utiliser des préfixes d'index pour prendre en charge les requêtes, mais les index composés comprenant des champs géospatiaux ou de texte sont un cas particulier de index composés clairsemés . Si un document n'inclut pas de valeur pour l'un des champs d'index de texte dans un index composé, il ne sera pas inclus dans l'index.
Afin de garantir des résultats corrects pour une recherche par préfixe, un plan de requête alternatif sera choisi sur l'index composé clairsemé :
Configuration de certaines données de test dans MongoDB 3.4.5 pour illustrer le problème potentiel :
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 })
Ensuite, forcer l'utilisation de l'index de texte composé :
db.myCollection.find({user_id:123}).hint('myIndex')
Le résultat inclut uniquement le document unique avec le champ de texte indexé name
, plutôt que les trois documents attendus :
{
"_id": ObjectId("595ab19e799060aee88cb035"),
"user_id": 123,
"name": "Banana"
}
Cette exception devrait être plus clairement mise en évidence dans la documentation de MongoDB ; regarder/voter pour DOCS-10322 dans le suivi des problèmes MongoDB pour les mises à jour.