MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

A consulta Mongodb não usa prefixo no índice composto com campo de texto


Em geral, o MongoDB pode usar prefixos de índice para dar suporte a consultas, no entanto, índices compostos, incluindo campos geoespaciais ou de texto, são um caso especial de índices compostos esparsos . Se um documento não incluir um valor para nenhum dos campos de índice de texto em um índice composto, ele não será incluído no índice.

Para garantir resultados corretos para uma pesquisa de prefixo, um plano de consulta alternativo será escolhido sobre o índice composto esparso:

Configurando alguns dados de teste no MongoDB 3.4.5 para demonstrar o possível 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 })

Então, forçando o índice de texto composto a ser usado:
db.myCollection.find({user_id:123}).hint('myIndex')

O resultado inclui apenas o documento único com o campo de texto indexado name , em vez dos três documentos que seriam esperados:
{
  "_id": ObjectId("595ab19e799060aee88cb035"),
  "user_id": 123,
  "name": "Banana"
}

Essa exceção deve ser mais claramente destacada na documentação do MongoDB; assista/vote DOCS-10322 no rastreador de problemas do MongoDB para atualizações.