Эффективность запроса mongodb - PullRequest
0 голосов
/ 09 июля 2019

Какой запрос будет более эффективным:

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 Ответ

1 голос
/ 26 июля 2019

В следующем блоке запускается столько запросов к базе данных, сколько вы отправили в 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 io plain 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>]
...