gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:06:27 24 4
gpt4 key购买 nike

假设我有这个模型:

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

最佳答案

Mongoengine 在每个文档的基础上取消引用,因此您将查询 n 次集合 b - 给出以下代码:

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

关于python - MongoEngine是否在不同对象上缓存相同的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34549282/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com