1º:Tus consultas son demasiado complicadas. Usar $elemMatch con demasiada frecuencia. Segundo:si puede incluir su clave fragmentada en la consulta, mejorará drásticamente la velocidad.
Voy a optimizar sus consultas para usted:
db.user.find({
createdAt: {
$gte: ISODate("2014-12-01"),
$lte: ISODate("2014-12-31")
}
}).explain()
db.user.find({
'transaction.product':'mobile'
}).explain()
db.user.find({
'transaction.product':'mobile',
firstTransaction:{
$in:[
ISODate("2015-01-01"),
ISODate("2015-01-02")
]
}
}).explain()
La conclusión es esta:incluir su clave de fragmento cada vez es un ahorro de tiempo.
Incluso podría ahorrar tiempo si recorre las claves fragmentadas y realiza la misma consulta varias veces.