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:
yearyearemonthyearemonthedayyearemonthedayehour
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!