查询集和聚合之间的性能差异

时间:2021-02-25 17:29:04

标签: python mongodb pymongo mongoengine flask-mongoengine

我在我的 Flask 应用中使用了 flask-mongoengine 模块。我有一个名为 DocumentTask,它继承自 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 会降低性能?

0 个答案:

没有答案