Как выбрать все строки без ссылок из другого модельного класса в GQL?

Я имею

class Question(db.Model):
    wording = db.StringProperty(required=True)

class Answer(db.Model):
    question = db.ReferenceProperty(Question, required=True)
    userId = db.IntegerProperty(required=True)

И я хочу

SELECT * FROM Question WHERE Id NOT IN (
       SELECT QuestionId FROM Answer WHERE userId = 1)

Как это сделать в GQL

1 ответ

Решение

GQL не имеет NOT IN Заявление, так что, к сожалению, не возможно сделать именно то, что вы хотите.

Если общий набор userIds невелик, вы можете отменить свой запрос, чтобы использовать IN заявление. Например:

SELECT * FROM Answer WHERE userId IN ('2', '3')

Обратите внимание, что это выполняет подзапрос для каждого значения в IN оператор, и вам разрешено максимум 30 запросов на оператор GQL.

Если общий набор ответов где userId = 1 маленький, вы можете выбрать все ответы и отфильтровать userId = 1 в вашем собственном коде. Однако, если набор Ответов от userId 1 велик, это не будет особенно эффективно.

Наконец, вместо вычисления любого из этих запросов по требованию вы можете использовать cron для предварительного вычисления результатов (и сохранения их в хранилище данных и / или memcache). Когда ваш код требует результатов одного из этих запросов, вы можете загрузить кэшированный результат.

Другие вопросы по тегам