我在我的 Flask 应用中使用了 flask-mongoengine
模块。我有一个名为 Document
的 Task
,它继承自 Document
在我的一个 REST API 端点中,我尝试获取与特定过滤条件匹配的所有任务。
user_tasks = Q(owner=user_id, latest_version=True, is_deleted=False)
user_shared_tasks = Q(groups__in=user_groups_id, is_deleted=False, state="Done")
tasks = Task.objects(user_tasks | user_shared_tasks).no_dereference()
do_some_logic(tasks)
返回的任务数是200个任务,每个任务文档很大(包含很多字段)
但是,在尝试使用聚合进行相同操作时,我发现性能得到了增强
tasks = Task.objects.aggregate([
{
'$match': {
'$or': [
{
'owner': user_id,
'latest_version': True,
'is_deleted':False
},
{
'groups': {'$in': user_groups_id},
'is_deleted': False,
'state': "Done"
}
]
},
}
])
tasks = list(tasks)
tasks = list(map(lambda t: Task(**t), tasks))
with no_dereference(Task):
do_some_logic(tasks)
使用聚合检索数据所用的时间是使用 QuerySet
所用时间的一半
有什么理由吗?这是否意味着使用 QuerySet
会降低性能?