Eu tenho o seguinte tipo de dados (simplificado um pouco do meu caso real) no MongoDB:
{
"name":"some name",
"attrs":[
{"n":"subject","v":"Some subject"},
{"n":"description","v":"Some great description"},
{"n":"comments","v":"Comments are here!"},
]
}
O array attrs é um contêiner para atributos dinâmicos, ou seja, não sei de antemão que tipo de atributos são colocados lá. n significa nome e v significa valor.
O livro MongoDB In Action descreve isso como uma solução para ter atributos dinâmicos no caso em que os atributos são completamente imprevisíveis. Também descreve que você pode indexá-lo assim:
db.mycollection.ensureIndex({"attrs.n":1, "attrs.v":1})
As consultas podem ser feitas assim:
db.mycollection.find({attrs: {$elemMatch: {n: "subject", v: "Some subject"}}})
Quando eu testei isso, obtive um desempenho muito ruim. Testei com mycollection com 2 milhões de documentos e sem índice parece ter um desempenho melhor.
Então, a pergunta continua: existe uma maneira de indexar esse tipo de configuração de atributo dinâmico para que a indexação tenha um bom desempenho? No meu caso, não é possível ter apenas chaves como "assunto" e "descrição" e indexá-las todas ...