我的Mongo查询运行缓慢,尽管已建立索引

时间:2019-02-15 13:57:06

标签: mongodb

我正在优化我的Mongo请求,但是尽管有索引,但我的查询还是很慢。我猜它们的设置不正确。

我有一个集合,其中包含这样的文档:

{
    "_id" : ObjectId("5a2a69879a8d4e03f69522c1"),
    "id" : "fbc1ccac69611504c06ca3018121b7231ce14a10",
    "sessions" : [ 
        {
            "webInstanceId" : 1,
            "timeStart" : 1495743152,
            "timeEnd" : 1495743152,
            "isPersonalized" : false,
            "context" : {
                "geolocation" : {},
                "weather" : {},
                "device" : "unknown"
            },
            "pageViews" : [ 
                {
                    "url" : "http://www.site1.fr/page1",
                    "id" : 658936,
                    "timeStart" : 1495743152,
                    "timeEnd" : 1495743152,
                    "events" : []
                },
                {
                    "url" : "http://www.site2.fr/page2",
                    "id" : 658936,
                    "timeStart" : 1495743152,
                    "timeEnd" : 1495743152,
                    "events" : []
                },
            ]
        }
    ],
    "profile" : {
        "physical" : [],
        "tastes" : [],
        "otherCriteria" : []
    }
}

我正在尝试进行汇总,以获取在用户还访问过“ source_url”的会话中访问过的所有其他页面URL。最终的想法是获取正在查看URL“ source_url”的用户可能感兴趣的所有URL的列表(因此不在已访问页面的列表中)

这里的问题是我的馆藏容量为100GB,尽管我在'sessions.pageViews.url'上获得了索引,但我的查询却花了很长时间。

aggregate([
    {
            '$match': {'sessions.pageViews.url': source_url}
    },
    {
            '$project': {'sessions.pageViews.url': 1}
    },
    {
            '$unwind': '$sessions'
    },
    {
            '$match': {"sessions.pageViews.url": source_url}
    },
    {
        '$project': {
            'intersection': {
                '$size': {
                    '$setIntersection': [
                        "$sessions.pageViews.url", visited_pages
                    ]
                }
            },
            'difference': {
                '$setDifference': [
                        "$sessions.pageViews.url", visited_pages
                ]
            }
        }
    },
    {
        '$match': {'difference.0': {'$exists': True}}
    },
    {
        '$sort': {'intersection': -1}
    },
    {
        '$limit': 100 * result_amount
    },
    {
        '$unwind': '$difference'
    },
    {
        '$match': {"difference": {'$ne': source_url, '$regex': filter_regex, '$nin': urls_to_exclude}}
    }
])
#### The index
{
    "sessions.pageViews.url" : 1
}

缓存后,此查询不到一秒钟。但大多数情况下,这需要10到12秒。

我知道这是不正常的,即使收藏很多。有人对什么地方有错吗?我猜测索引不是最佳索引,或者排序是杀手.。

0 个答案:

没有答案