Thứ nhất:Các truy vấn của bạn quá phức tạp. Sử dụng $ elemMatch theo cách quá thường xuyên. 2 và:nếu bạn có thể đưa khóa phân đoạn của mình vào truy vấn, nó sẽ cải thiện đáng kể tốc độ.
Tôi sẽ tối ưu hóa các truy vấn của bạn cho bạn:
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()
Điểm mấu chốt là thế này:bao gồm khóa phân đoạn của bạn mỗi lần để tiết kiệm thời gian.
Nó thậm chí có thể tiết kiệm thời gian để lặp lại các khóa phân đoạn của bạn và thực hiện cùng một truy vấn nhiều lần.