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

问题描述

我在我的 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 会降低性能

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...