收听Mongo查询

时间:2017-08-14 06:25:03

标签: mongodb

我是Mongo的新手,并试图获得不同的用户数量。字段Id和Status不是单独的索引列,但在该字段上都存在复合索引。我当前的查询是这样的,匹配条件根据要求而变化。

DBQuery.shellBatchSize = 1000000;
db.getCollection('username').aggregate([
  {$match:
    { Status: "A"
    } },
 {"$group" : {_id:"$Id", count:{$sum:1}}}
 ]);

我们是否可以更多地优化此查询或在集合上添加并行运行,以便我们可以更快地获得结果?

此致

1 个答案:

答案 0 :(得分:0)

您可以通过在聚合方法中传入explain=true选项来调整聚合管道。

db.getCollection('username').aggregate([
  {$match: { Status: "A" } },
  {"$group" : {_id:"$Id", count:{$sum:1}}}],
{ explain: true });

然后输出以下内容以使用

{
        "stages" : [
                {
                        "$cursor" : {
                                "query" : {
                                        "Status" : "A"
                                },
                                "fields" : {
                                        "Id" : 1,
                                        "_id" : 0
                                },
                                "queryPlanner" : {
                                        "plannerVersion" : 1,
                                        "namespace" : "test.usernames",
                                        "indexFilterSet" : false,
                                        "parsedQuery" : {
                                                "Status" : {
                                                        "$eq" : "A"
                                                }
                                        },
                                        "winningPlan" : {
                                                "stage" : "EOF"
                                        },
                                        "rejectedPlans" : [ ]
                                }
                        }
                },
                {
                        "$group" : {
                                "_id" : "$Id",
                                "count" : {
                                        "$sum" : {
                                                "$const" : 1
                                        }
                                }
                        }
                }
        ],
        "ok" : 1
}

因此,为了加快查询速度,我们需要一个索引来帮助管道的匹配部分,所以让我们在Status

上创建一个索引
> db.usernames.createIndex({Status:1})
{
    "createdCollectionAutomatically" : true,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

如果我们现在再次运行解释,我们将获得以下结果

{
        "stages" : [
                {
                        "$cursor" : {
                                "query" : {
                                        "Status" : "A"
                                },
                                "fields" : {
                                        "Id" : 1,
                                        "_id" : 0
                                },
                                "queryPlanner" : {
                                        "plannerVersion" : 1,
                                        "namespace" : "test.usernames",
                                        "indexFilterSet" : false,
                                        "parsedQuery" : {
                                                "Status" : {
                                                        "$eq" : "A"
                                                }
                                        },
                                        "winningPlan" : {
                                                "stage" : "FETCH",
                                                "inputStage" : {
                                                        "stage" : "IXSCAN",
                                                        "keyPattern" : {
                                                                "Status" : 1
                                                        },
                                                        "indexName" : "Status_1",
                                                        "isMultiKey" : false,
                                                        "multiKeyPaths" : {
                                                                "Status" : [ ]
                                                        },
                                                        "isUnique" : false,
                                                        "isSparse" : false,
                                                        "isPartial" : false,
                                                        "indexVersion" : 2,
                                                        "direction" : "forward",
                                                        "indexBounds" : {
                                                                "Status" : [
                                                                        "[\"A\", \"A\"]"
                                                                ]
                                                        }
                                                }
                                        },
                                        "rejectedPlans" : [ ]
                                }
                        }
                },
                {
                        "$group" : {
                                "_id" : "$Id",
                                "count" : {
                                        "$sum" : {
                                                "$const" : 1
                                        }
                                }
                        }
                }
        ],
        "ok" : 1
}

我们现在可以立即看到这是使用索引。

https://docs.mongodb.com/manual/reference/explain-results/