MongoEngine是否在不同对象上缓存相同的引用?

时间:2015-12-31 16:52:47

标签: python mongodb mongoengine

假设我有这个模型:

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 次?

1 个答案:

答案 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文档将在单个查询中返回(前提是文档数量在默认限制内)。