我正在优化我的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秒。
我知道这是不正常的,即使收藏很多。有人对什么地方有错吗?我猜测索引不是最佳索引,或者排序是杀手.。