1°:le tue domande sono eccessivamente complicate. Usare $elemMatch troppo spesso. 2°:se puoi includere la tua chiave shard nella query, migliorerà drasticamente la velocità.
Ottimizzerò le tue query per te:
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 conclusione è questa:includi la tua shard key ogni volta che fa risparmiare tempo.
Potrebbe anche risparmiare tempo per scorrere le tue chiavi shard ed eseguire la stessa query più volte.