MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

La query Mongodb non utilizza il prefisso sull'indice composto con il campo di testo

In generale MongoDB può utilizzare i prefissi degli indici per supportare le query, tuttavia gli indici composti che includono campi geospaziali o di testo sono un caso speciale di indici composti sparsi . Se un documento non include un valore per nessuno dei campi dell'indice di testo in un indice composto, non verrà incluso nell'indice.

Al fine di garantire risultati corretti per una ricerca di prefissi, verrà scelto un piano di query alternativo sull'indice composto sparso:

Configurazione di alcuni dati di test in MongoDB 3.4.5 per dimostrare il potenziale problema:

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 })

Quindi, forzando l'utilizzo dell'indice di testo composto:

db.myCollection.find({user_id:123}).hint('myIndex')

Il risultato include solo il singolo documento con il campo di testo indicizzato name , anziché i tre documenti che ci si aspetterebbe:

{
  "_id": ObjectId("595ab19e799060aee88cb035"),
  "user_id": 123,
  "name": "Banana"
}

Questa eccezione dovrebbe essere evidenziata più chiaramente nella documentazione di MongoDB; watch/upvote DOCS-10322 nel tracker dei problemi di MongoDB per gli aggiornamenti.