我有一个像这样结构的集合:
{
"_id" : ObjectId("59d7cd63dc2c91e740afcdb"),
"enrollment" : [
{ "month":-10, "enroll":'00'},
{ "month":-9, "enroll":'00'},
{ "month":-8, "enroll":'01'},
//other months
{ "month":8, "enroll":'11'},
{ "month":9, "enroll":'11'},
{ "month":10, "enroll":'00'}
]
}
我正在尝试运行以下查询:
db.getCollection('collection').find({
"enrollment": {
"$not": {
"$elemMatch": { "month": { "$gte": -2, "$lte": 9 }, "enroll": "00" }
}
}
}).count()
此查询需要1.6到1.9秒。如果可能的话,我需要尽可能降低这个数毫秒。
我尝试在月份和注册字段上创建多键索引。我尝试了各种组合,但查询没有使用任何索引。
我尝试了所有这些组合:
1. { 'enrollment.month':1 }
2. { 'enrollment.month':1 }, { 'enrollment.enroll':1 } -- two seperate indexes
3. { 'enrollment.month':1, 'enrollment.enroll':1}
4. { 'enrollment.enroll':1, 'enrollment.month':1}
Parsed Query:
查询计划:
我们非常感谢任何改善表现的建议。
我相信硬件不是问题,但可以提出任何建议。
我的数据量并不大。它略低于1GB。文件总数为41K,子文件数约为。 1300万
注意:我在最近几天发布了几个关于此的问题,但有了这个,我试图缩小范围。请不要将此作为我之前问题的副本。
答案 0 :(得分:0)
尝试反转查询:
db.getCollection('collection').find({
"enrollment": {
"$elemMatch": {
"month": { "$lt": -2, "$gt": 9 },
"enroll": {$ne: "00"}
}
}
}).count()