Jiv*_*van 5 mongodb mongoengine mongodb-query aggregation-framework
关于其中一个或两个案例的慢速MongoDB聚合,有很多问题:
令我困扰的是,在我正在设置的原型中,我的查询始终非常缓慢,其中:
此查询lookup对要检索的主文档执行聚合,并且这样写(使用Python的MongoEngine)
author_lookup = {
'$lookup': {
'from': 'users',
'localField': 'author_id',
'foreignField': '_id',
'as': 'author'
}
}
cursor = post_collection.Post.objects.all().aggregate(author_lookup)
Run Code Online (Sandbox Code Playgroud)
冒着重复自己的风险,就像这个原型的当前状态一样,Post要检索的文档不超过10个,可能Author需要查找3个文档.
以下是此查询连续5次点击的定时结果:
1.9418830871582031 seconds
3.0417070388793945 seconds
2.1725950241088867 seconds
1.3020501136779785 seconds
3.728671073913574 seconds
Run Code Online (Sandbox Code Playgroud)
很慢,mm?
现在,如果我删除聚合部分并只是查询:
cursor = post_collection.Post.objects.all()
Run Code Online (Sandbox Code Playgroud)
在其他条件相同的情况下,以下是此新查询连续5次点击的定时结果:
0.26596999168395996 seconds
0.00011920928955078125 seconds
0.00011205673217773438 seconds
0.0001659393310546875 seconds
0.00013589859008789062 seconds
Run Code Online (Sandbox Code Playgroud)
我要注意的第一件事是,当使用聚合时,第一个结果并不比以下结果慢.这使我认为使用当前形式的聚合查询,不执行缓存操作.
- > 使用聚合框架时有没有办法缓存结果$lookup?
第二件事是,除了在不使用聚合时工作中明显的缓存机制,似乎单独的第一个查询(未缓存)的执行速度比使用聚合时快十倍.我发现很难相信在总共10 lookup个Author文档上执行聚合超过4 个Post文档所需的速度是检索10个Post文档的速度的10倍.
所有这一切使我认为,尽管已经在查找聚合上遵循MongoDB文档,但我必须在这里做错事.