哪种查询会更高效:
for id in user.posts:
Post.objects.get(id=id)
或
posts = Post.objects(user=user_id)
具有下一个模式
Post(Document):
user = ObjectIdField()
User(Document):
posts = ListField(ObjectIdField())
如果user
文档中的Post
字段有索引,并且每个20
平均有User
个帖子。也对其他使用模式场景感到好奇
答案 0 :(得分:1)
以下代码块会触发您在user.posts
中发布的数据库查询,因此无论如何它都会变慢。
for id in user.posts:
Post.objects.get(id=id)
但是如果您这样使用它:
Post.objects.get(id__in=user.posts)
然后,性能将与使用Post.objects(user=user_id)
相似,因为默认情况下主键被索引了
我相信您也应该使用ReferenceField,即普通的ObjectId。它们允许延迟加载引用
class Post(Document):
user = ReferenceField("User")
class User(Document):
name = StringField()
@property
def posts(self):
return Post.objects(user=self)
john = User(name='John').save()
post = Post(user=john).save()
print(john.posts()) # [<Post: Post object>]