Подзапрос в MongoEngine - PullRequest
       35

Подзапрос в MongoEngine

2 голосов
/ 12 февраля 2011

Имея образец кода:

import mongoengine as mongo

class User(mongo.Document):
    name = mongo.StringField()
    age = mongo.IntField()    

class Post(mongo.Document):
    title = mongo.StringField()
    author = mongo.ReferenceField(User)

Я хочу получить все сообщения, созданные пользователями в возрасте до 30 лет, одним из способов является запрос в два этапа:

users = User.objects(age__lt=30)
posts = Post.objects(author__in=users)

Но даже это не совсем плохо, он вызывает и подключается к базе данных N раз без необходимости. Поэтому я хочу сделать запрос всего за один шаг, я попытался:

posts = Post.objects(author__age__lt=30)

Но не работает, просто возвращает мне пустой список, а не ошибку. Что я делаю не так?

Ответы [ 2 ]

3 голосов
/ 17 июня 2011

Что я делаю не так?

Ничего, что вы не можете запросить по ссылочным полям - см. Вставить против ссылки

Таким образом, даже если синтаксис будет поддерживаться, это займет два закулисных запроса. Если это то, что нужно - добавьте билет в github, и я посмотрю, как его добавить:)

В настоящее время обновления MongoEngine идут быстро и быстро - так что скоро выйдет новый релиз! В ветке dev есть несколько замечательных улучшений, в том числе эффективные ленивые разыменования и обновления дельты для атомарного сохранения!

1 голос
/ 14 февраля 2011

... он вызывает и подключается к базе данных N раз без необходимости

MongoDB поддерживает предложение $in, которое позволяет выбирать несколько объектов только с одним запросом, одним соединением. Если вы видите несколько соединений, вам, вероятно, следует сообщить об этом автору mongoengine.

Поскольку MongoDB не поддерживает объединения, ваш метод "загрузить пользователей, загрузить их сообщения" , как правило, является правильным.

Что я делаю не так?

Для этого уровня детализации лучше всего связаться с автором напрямую . На странице github есть и его электронная почта, и его блог. Глядя на репо, его последнее обновление было в октябре 2010 года, а номер последней версии был 0,4. Три месяца без обновлений - это долгое время в этом пространстве, и у него даже нет версии 1.0, поэтому вполне вероятно, что вам нужно будет поговорить с автором напрямую.

...