使用排序

时间:2016-05-28 15:24:26

标签: mongodb aggregation-framework

我有超过1,200,000个文档的收藏(tvshow剧集),

这是我的架构:

  var episodeSchema = new Schema({
    imdbId: { type : String },
    showId: {type : String},
    episodeId: { type : String },
    episodeIdNumber:{ type : Number },
    episodeTitle:{ type : String },
    showTitle:{type : String},
    seasonNumber:{type : Number},
    episodeNumber:{type : Number},
    airDate : {type : String},
    summary:{type : String}
});

我为episodeTitle episodeIdNumber seasonNumber episodeNumber episodeIdshowId

创建了索引

现在我使用mongodb聚合组来获取每个电视剧剧集

这是我使用的聚合查询:

episode.aggregate( [
            { $match : { showId : "scorpion" } },
            {$sort:{"episodeNumber":-1}},
            { $group: {

            _id: "$seasonNumber", count: { $sum: 1 } ,
            episodes : { $push:  { episodeId : "$episodeId" , episodeTitle: "$episodeTitle" , episodeNumber: "$episodeNumber" , seasonNumber: "$seasonNumber" , airDate: "$airDate"  } }

            } }
            ,
            { $sort : { _id : -1  } }
] )

现在,当我运行此查询时,它需要超过2605.907 ms,经过一些挖掘后我发现它为什么慢,这是因为使用了{$sort:{"episodeNumber":-1}},而没有使用{$sort:{"episodeNumber":-1}}19.178 ms左右运行。

正如我上面提到的,我为episodeNumber字段创建了一个索引并基于MongoDB Aggregation Pipeline Optimization 我在sort之后使用match所以基本上一切都很好,我没有任何错误。

所以在此之后我认为我的索引有问题,所以我删除了episodeNumber索引并重新索引,但我没有同时改变。

最后一次,我尝试在没有episodeNumber索引的情况下运行聚合组查询,令人惊讶的是它更快!它需要20.118 ms

我想知道为什么会发生这种情况,是不是索引能够获得更快的查询?

更新

查询解释输出:

{
        "waitedMS" : NumberLong(0),
        "stages" : [
            {
                "$cursor" : {
                    "query" : {
                        "showId" : "scorpion"
                    },
                    "sort" : {
                        "episodeNumber" : -1
                    },
                    "fields" : {
                        "airDate" : 1,
                        "episodeId" : 1,
                        "episodeNumber" : 1,
                        "episodeTitle" : 1,
                        "seasonNumber" : 1,
                        "_id" : 0
                    },
                    "queryPlanner" : {
                        "plannerVersion" : 1,
                        "namespace" : "test.episodes",
                        "indexFilterSet" : false,
                        "parsedQuery" : {
                            "showId" : {
                                "$eq" : "scorpion"
                            }
                        },
                        "winningPlan" : {
                            "stage" : "EOF"
                        },
                        "rejectedPlans" : [ ]
                    }
                }
            },
            {
                "$group" : {
                    "_id" : "$seasonNumber",
                    "count" : {
                        "$sum" : {
                            "$const" : 1
                        }
                    },
                    "episodes" : {
                        "$push" : {
                            "episodeId" : "$episodeId",
                            "episodeTitle" : "$episodeTitle",
                            "episodeNumber" : "$episodeNumber",
                            "seasonNumber" : "$seasonNumber",
                            "airDate" : "$airDate"
                        }
                    }
                }
            },
            {
                "$sort" : {
                    "sortKey" : {
                        "_id" : -1
                    }
                }
            }
        ],
        "ok" : 1
    }

0 个答案:

没有答案