使用Python3中的mongengine高效地检索数据(理想情况下是一批中的所有数据)

使用Python3中的mongengine高效地检索数据(理想情况下是一批中的所有数据),python,mongodb,mongoengine,Python,Mongodb,Mongoengine,假设我有一个从Document类继承的类User(我使用的是Mongoengine)。现在,我想检索在某个时间戳之后注册的所有用户。以下是我正在使用的方法: def get_users(cls, start_timestamp): return cls.objects(ts__gte=start_timestamp) 3秒钟内返回1000个文档。这是非常缓慢的。我用SQL在几毫秒内完成了类似的查询。我是MongoDB新手,一般来说没有SQL,所以我想我做错了什么 我怀疑检索速度很慢,因

假设我有一个从Document类继承的类User(我使用的是Mongoengine)。现在,我想检索在某个时间戳之后注册的所有用户。以下是我正在使用的方法:

def get_users(cls, start_timestamp):
    return cls.objects(ts__gte=start_timestamp)
3秒钟内返回1000个文档。这是非常缓慢的。我用SQL在几毫秒内完成了类似的查询。我是MongoDB新手,一般来说没有SQL,所以我想我做错了什么

我怀疑检索速度很慢,因为它是分几批完成的。我在某个地方读到PyMongo的批量是101,但我不知道Mongoengine是否也是如此

我可以更改批量大小,以便一次获取所有文档吗。我将知道大约总共将检索多少数据

欢迎提出任何其他建议


谢谢大家!

正如您所建议的,运行此查询不可能需要3秒钟。但是,问题不在于pymongo驱动程序的性能,需要考虑以下几点:

  • 确保
    ts
    字段包含在用户集合的
  • Mongoengine执行一些积极的反引用操作,因此,如果1000个返回的用户文档有一个或多个
    ReferenceField
    ,则每个文档都会导致额外的查询
  • Mongoengine为pymongo方法提供了一种查询mongodb的最有效方法
  • mongodb是官方的PythonODM,其部分目的是提供比mongoengine更好的默认性能

正如您所建议的,运行此查询不可能需要3秒钟。但是,问题不在于pymongo驱动程序的性能,需要考虑以下几点:

  • 确保
    ts
    字段包含在用户集合的
  • Mongoengine执行一些积极的反引用操作,因此,如果1000个返回的用户文档有一个或多个
    ReferenceField
    ,则每个文档都会导致额外的查询
  • Mongoengine为pymongo方法提供了一种查询mongodb的最有效方法
  • mongodb是官方的PythonODM,其部分目的是提供比mongoengine更好的默认性能

我已经使用pymongo的直接接口改进了性能。速度从3秒提高到300毫秒,真是令人惊讶。在问题的代码段中,我使用Mongoengine的方式是否有问题?如果我需要编写pymongo,那么使用Mongoengine没有任何价值。可能是问题的一部分。谢谢你的回答!我已经使用pymongo的直接接口改进了性能。速度从3秒提高到300毫秒,真是令人惊讶。在问题的代码段中,我使用Mongoengine的方式是否有问题?如果我需要编写pymongo,那么使用Mongoengine没有任何价值。可能是问题的一部分。谢谢你的回答!