查询效率mongodb

时间:2019-07-09 13:36:59

标签: python mongodb mongodb-query mongoengine

哪种查询会更高效:

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个帖子。也对其他使用模式场景感到好奇

1 个答案:

答案 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>]