假设我有这个模型:
class B(db.Document):
pass
class A(db.Document):
b = db.ReferenceField(B)
我知道如果我有一个A
对象,那么多次调用a.b
只会查询一次MongoDB,因为MongoEngine会进行缓存。
但是,如果我有 n A
个对象的列表,那么每个对象都会引用相同的 B
对象,如果我调用的话每个a.b
会查询MongoDB一次还是 n 次?
答案 0 :(得分:1)
基于每个文档的Mongoengine derefernce,因此您将查询b
集合 n次 - 给出以下代码:
import mongoengine as mdb
class B(mdb.Document):
pass
class A(mdb.Document):
n = mdb.IntField()
b = mdb.ReferenceField(B)
b = B().save()
# Save 100 A docs
for n in range(100):
A(n=n,b=b).save()
# Make a list of the A docs
a_objects = list([A.objects(n=_).get() for _ in range(100)])
for a in a_objects:
print (a.n, a.b)
如果您在查看mongostat时运行此操作,则可以看到这会导致101次插入,然后是200次查询。
这是你应该避免制作mongoengine文件列表的一个原因,请考虑以下代码:
import mongoengine as mdb
class B(mdb.Document):
pass
class A(mdb.Document):
n = mdb.IntField()
b = mdb.ReferenceField(B)
b = B().save()
# Save 100 A docs
for n in range(100):
A(n=n,b=b).save()
# Use a QuerySet on A
for a in A.objects:
print (a.n, a.b)
这将导致101个插入和101个查询,因为您需要的所有A文档将在单个查询中返回(前提是文档数量在默认限制内)。