Tem certeza de que seu índice foi criado? você poderia fornecer a saída de
getIndexes()
da sua coleção por exemplo:
db.my_collection.getIndexes()
e a explicação da sua consulta
db.my_collection.find({created_at_year: 2014, created_at_month: 1, created_at_day: 28 }).explain()
PS:claro que devo concordar com @Aesthete sobre o fato de você armazenar muito mais do que precisa...
Atualização de 29/01/2014
Perfeito! Como você vê, você tem quatro índices diferentes quando pode criar UM índice composto que incluirá todos eles.
definindo
db.my_collection.ensureIndex({created_at_year: 1, created_at_month: 1, created_at_day: 1, created_at_hour: 1 })
fornecerá um índice mais preciso que permitirá que você consulte:
year
year
emonth
year
emonth
eday
year
emonth
eday
ehour
Isso tornará suas consultas (com as quatro chaves) muito mais rápidas, pois todos os seus critérios serão atendidos nos dados do índice!
observe que a ordem das chaves em
ensureIndex()
é crucial, essa ordem realmente define a lista de consultas acima mencionada! Observe também que se tudo o que você precisa são esses 4 campos, então se você especificar uma projeção correta
ex:
db.my_collection.find({created_at_year: 2014, created_at_month: 1, created_at_day: 28}, { created_at_year: 1, created_at_month: 1, created_at_day: 1 })
então será usado apenas o índice, que é o desempenho máximo!