【发布时间】:2016-05-17 09:17:43
【问题描述】:
我有以下 mongoengine 模型:
class MyModel(Document):
date = DateTimeField(required = True)
data_dict_1 = DictField(required = False)
data_dict_2 = DictField(required = True)
在某些情况下,数据库中的文档可能非常大(大约 5-10MB),并且 data_dict 字段包含复杂的嵌套文档(字典列表的字典等...)。
我遇到了两个(可能相关的)问题:
- 当我运行本机 pymongo find_one() 查询时,它会在一秒钟内返回。当我运行 MyModel.objects.first() 时,需要 5-10 秒。
-
当我从数据库中查询单个大文档,然后访问其字段时,只需 10-20 秒即可完成以下操作:
m = MyModel.objects.first() val = m.data_dict_1.get(some_key)
对象中的数据不包含对任何其他对象的任何引用,因此这不是对象取消引用的问题。
我怀疑这与 mongoengine 的内部数据表示的一些低效率有关,这会影响文档对象的构造以及字段访问。有什么办法可以改善吗?
【问题讨论】:
-
似乎有两种不同的东西。本机方法加载 1 个文档并停止,而 mongoengine 加载所有文档并返回第一个。尝试从
find_one()更改为list(db.collection.find())[0]到equal 方法。 -
我还尝试在 mongoengine 查询中添加 limit(1),但没有帮助。似乎大部分时间都花在构建 mongoengine Document 对象上,以及所有嵌套对象..
-
skip和limit在加载文档后工作:( 尝试按特定查询过滤...http://docs.mongoengine.org/guide/querying.html#query-operators -
我认为这是不正确的 - 从我在使用 limit(1) 时在 mongoengine 查询的“解释”中看到的内容来看,它只查询来自 mongo 的单个文档(“解释”结果直接来自mongo)。因此,在同样的意义上,与 list(db.collection.find())[0] 进行比较是不正确的 - 因为这会将整个集合的内容加载到内存中 - 而不是 mongoengine 正在做的事情。
-
skip和limit不应用于加载的文档,它们作为查询参数发送。
标签: python mongodb pymongo mongoengine