使用慢速MongoDB聚合查询时遇到问题

时间:2015-11-08 18:24:07

标签: performance mongodb aggregation-framework

我在MongoDB中有以下聚合查询

{
  client      :  1,
  admin       :  1,
  assessment  :  1,
  submitted   : -1,
}

对于包含大约2000个文档的集合执行得非常糟糕。它通常需要5秒钟才能完成,我已经看到了糟糕的15秒。我在提交集合上有以下索引:

db.submissions.aggregate([
  {$match: {
    client: {$in: ['54a4cdfdd0666c243035dc98','55cc985291a0ffab6849de34']}, 
    admin: '542b4af8880fc300007eb411'
  }}, 
  {$sort: {client:1, submitted: -1}}, 
  {$group: {
    _id: '$client', 
    lastSubmitted: {$first: '$submitted'}, 
    timezone: {$first: '$timezone'}
  }}
], {explain: true})

我被困在为什么这么长时间。有什么建议吗?

修改

我已经运行了查询

{
  "stages" : [
    {
      "$cursor" : {
        "query" : {
          "client" : {
            "$in" : [
              "54a4cdfdd0666c243035dc98",
              "55cc985291a0ffab6849de34"
            ]
          },
          "admin" : "542b4af8880fc300007eb411"
        },
        "fields" : {
          "client" : 1,
          "submitted" : 1,
          "timezone" : 1,
          "_id" : 0
        },
        "queryPlanner" : {
          "plannerVersion" : 1,
          "namespace" : "webdemo.submissions",
          "indexFilterSet" : false,
          "parsedQuery" : {
            "$and" : [
              {
                "admin" : {
                  "$eq" : "542b4af8880fc300007eb411"
                }
              },
              {
                "client" : {
                  "$in" : [
                    "54a4cdfdd0666c243035dc98",
                    "55cc985291a0ffab6849de34"
                  ]
                }
              }
            ]
          },
          "winningPlan" : {
            "stage" : "FETCH",
            "inputStage" : {
              "stage" : "IXSCAN",
              "keyPattern" : {
                "client" : 1,
                "admin" : 1,
                "assessment" : 1,
                "submitted" : -1
              },
              "indexName" : "client_1_admin_1_assessment_1_submitted_-1",
              "isMultiKey" : false,
              "direction" : "forward",
              "indexBounds" : {
                "client" : [
                  "[\"54a4cdfdd0666c243035dc98\", \"54a4cdfdd0666c243035dc98\"]",
                  "[\"55cc985291a0ffab6849de34\", \"55cc985291a0ffab6849de34\"]"
                ],
                "admin" : [
                  "[\"542b4af8880fc300007eb411\", \"542b4af8880fc300007eb411\"]"
                ],
                "assessment" : [
                  "[MinKey, MaxKey]"
                ],
                "submitted" : [
                  "[MaxKey, MinKey]"
                ]
              }
            }
          },
          "rejectedPlans" : [ ]
        }
      }
    },
    {
      "$sort" : {
        "sortKey" : {
          "client" : 1,
          "submitted" : -1
        }
      }
    },
    {
      "$group" : {
        "_id" : "$client",
        "lastSubmitted" : {
          "$first" : "$submitted"
        },
        "timezone" : {
          "$first" : "$timezone"
        }
      }
    }
  ],
  "ok" : 1
}

在shell中解释并获得

db.submissions.getIndices()

编辑2

我从[ { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "webdemo.submissions" }, { "v" : 1, "key" : { "client" : 1, "admin" : 1, "assessment" : 1, "submitted" : -1 }, "name" : "client_1_admin_1_assessment_1_submitted_-1", "ns" : "webdemo.submissions", "background" : true } ] 得到的输出是

setVisible(true);

0 个答案:

没有答案