1:Pertanyaan Anda terlalu rumit. Terlalu sering menggunakan $elemMatch.2nd:jika Anda dapat memasukkan kunci shard ke dalam kueri, kecepatan akan meningkat secara drastis.
Saya akan mengoptimalkan kueri Anda untuk Anda:
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()
Intinya adalah ini:sertakan kunci pecahan Anda setiap kali adalah penghemat waktu.
Bahkan mungkin menghemat waktu untuk mengulang kunci shard Anda dan membuat kueri yang sama beberapa kali.