在 Python 3 中使用 mongengine 高效地检索数据(理想情况下全部在一批中)
Efficiently retrieve data (all in one batch ideally) with mongengine in Python 3
假设我有 class 继承自文档 class 的用户(我正在使用 Mongoengine)。现在,我想检索在某个时间戳后注册的所有用户。这是我使用的方法:
def get_users(cls, start_timestamp):
return cls.objects(ts__gte=start_timestamp)
3秒返回1000个文档。这非常慢。我在几毫秒内在 SQL 中完成了类似的查询。一般来说,我是 MongoDB 和 No-SQL 的新手,所以我想我做错了什么。
我怀疑检索速度很慢,因为它是分几批完成的。我在某处读到 PyMongo 的批量大小为 101,但我不知道 Mongoengine 是否相同。
我可以更改批量大小吗,这样我就可以一次获取所有文档。我将大致知道总共将检索多少数据。
非常欢迎任何其他建议。
谢谢!
正如您所建议的那样,运行 这个查询不可能花费 3 秒。但是,问题不是 pymongo 驱动程序的性能问题,需要考虑一些事项:
- 确保
ts
字段包含在用户集合的 indexes 中
- Mongoengine 会进行一些积极的取消引用,因此如果 1000 个返回的用户文档有一个或多个
ReferenceField
,那么每一个都会导致额外的查询。 There are ways to avoid this.
- Mongoengine 提供a direct interface to the pymongo method for the mongodb aggregation framework这是迄今为止最有效的查询方式mongodb
- mongodb recently released an official python ODM pymodm 部分是为了提供比 mongoengine
更好的默认性能
假设我有 class 继承自文档 class 的用户(我正在使用 Mongoengine)。现在,我想检索在某个时间戳后注册的所有用户。这是我使用的方法:
def get_users(cls, start_timestamp):
return cls.objects(ts__gte=start_timestamp)
3秒返回1000个文档。这非常慢。我在几毫秒内在 SQL 中完成了类似的查询。一般来说,我是 MongoDB 和 No-SQL 的新手,所以我想我做错了什么。
我怀疑检索速度很慢,因为它是分几批完成的。我在某处读到 PyMongo 的批量大小为 101,但我不知道 Mongoengine 是否相同。
我可以更改批量大小吗,这样我就可以一次获取所有文档。我将大致知道总共将检索多少数据。
非常欢迎任何其他建议。
谢谢!
正如您所建议的那样,运行 这个查询不可能花费 3 秒。但是,问题不是 pymongo 驱动程序的性能问题,需要考虑一些事项:
- 确保
ts
字段包含在用户集合的 indexes 中 - Mongoengine 会进行一些积极的取消引用,因此如果 1000 个返回的用户文档有一个或多个
ReferenceField
,那么每一个都会导致额外的查询。 There are ways to avoid this. - Mongoengine 提供a direct interface to the pymongo method for the mongodb aggregation framework这是迄今为止最有效的查询方式mongodb
- mongodb recently released an official python ODM pymodm 部分是为了提供比 mongoengine 更好的默认性能