MongoDB查询很慢,没有使用索引

时间:2017-11-06 17:31:34

标签: mongodb mongodb-query

我有一个像这样结构的集合:

{
    "_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:

enter image description here

查询计划:

enter image description here

我们非常感谢任何改善表现的建议。

我相信硬件不是问题,但可以提出任何建议。

我的数据量并不大。它略低于1GB。文件总数为41K,子文件数约为。 1300万

注意:我在最近几天发布了几个关于此的问题,但有了这个,我试图缩小范围。请不要将此作为我之前问题的副本。

1 个答案:

答案 0 :(得分:0)

尝试反转查询:

   db.getCollection('collection').find({ 
      "enrollment": { 
         "$elemMatch": { 
             "month": { "$lt": -2, "$gt": 9 }, 
             "enroll": {$ne: "00"} 
         } 
      } 
   }).count()