Фильтруйте и сортируйте по разным полям в Google App Engine - PullRequest
0 голосов
/ 25 марта 2012

Следующий код выдает ошибку First ordering property must be the same as inequality filter property при выполнении, поскольку вы не можете упорядочить по полю, поскольку он не был фильтром.

q = Score.all()
q.filter("levelname = ", levelname)
q.filter("submitted >", int(time.time()) - (86400*7))
q.order("-score")
scoreList = q.fetch(10)

Что мне нужно сделать, так это найти 10 лучших результатов, возраст которых меньше недели. Могут быть десятки тысяч (если не больше) результатов, поэтому я не могу просто получить их все и отсортировать в python.

Есть ли способ сделать это?

Ответы [ 2 ]

2 голосов
/ 25 марта 2012

В общем, каждый раз, когда возникает вопрос о подсчете, все согласны с тем, что с GAE вы должны предварительно вычислить все, что можете. Я бы подошел к вашему конкретному требованию, касающемуся 10 лучших результатов, - создать объект, который будет иметь самые высокие оценки, и обновлять позицию всякий раз, когда у вас появляется новый результат, который перевешивает лучшие 10.

Когда вы вычисляете балл, вы можете запросить, сколько других баллов больше, чем вычисленный балл. Если счет больше 10, вам не нужно обновлять свои оценки. Это будет в большинстве случаев. Если количество равно или больше 10, вам необходимо обновить заказ, чтобы вы получили свои первые 10 и вставили новый счет в зависимости от ситуации.

Чтобы обработать компонент времени, я бы запустил какой-нибудь процесс, ежедневно проверяющий, нужно ли выселять счет из первой десятки, если так, то возьмите следующий наивысший, чтобы заменить его.

Вот несколько ответов на похожую тему, которые касаются шаблонов проектирования и логики, подходящей для хранилища данных GAE: Каков наилучший способ подсчета результатов в GQL?

0 голосов
/ 25 марта 2012

Как упоминает Сологуб, предварительные вычисления - это путь.

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

Это стоит больше места для хранения (еще одно поле на объект), но я полагаю, преимущество может состоять в том, что вы можете динамически выбирать, сколько лучших результатов вы хотите вернуть. (У вас также может быть несколько таких флагов, например, один за все время и один только за последнюю неделю и т. Д.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...