GAE Datastore - Как всегда получать новейшие / последние результаты и продолжать, где вы остановились?

1

Я использую Google App Engine (GAE), Datastore (используя JDO) и делаю это на Java.

Я хочу, чтобы следующее произошло:

Скажем, у меня есть следующая модель: Card, у нее есть только одно поле, и это время создания (я называю это "toc").

Я хочу всегда извлекать 3 новейших объекта карты, когда выполняется GET-запрос. Скажем, у меня в настоящее время есть 5 объектов Карт в хранилище данных, называемом C1, C2... C5. Они вставляются в этом порядке, то есть C5 - это новейшая сущность.

Теперь я выполняю свой GET-запрос и, таким образом, получаю объекты: C5, C4 и C3. После того, как я использую сущности на стороне клиента, скажем, через 5 минут. Я хочу получить следующие 3 новых объекта. Но за эти 5 минут в Datastore добавлено 2 новых карты, теперь они выглядят следующим образом: C1, C2, C3, C4, C5, C6, C7.

Теперь я хочу получить C7, C6 и Карту, которая является самой новой, но еще не получена, что означает, что я также хочу C2. т.е. я хочу C7, C6 и C2.

Я экспериментировал с курсорами и, похоже, не получаю такого поведения. В настоящее время я использую запрос, который сортирует карты по возрастанию, то есть я сначала получаю самые старые Карты, а затем, когда я их пройду, Курсор может фактически обнаружить, когда новые записи были добавлены и их извлечены. Но если после последнего запроса было добавлено больше 3, все равно будут принимать первые 3 (вместо последних 3), то есть я получу 3 самых старых карты "новых" карт. Есть ли способ получить "конечный курсор", фактически не дойдя до конца? Если есть, я смогу жить с получением 3 самых старых новейших Карт.

Реальное приложение: Представьте себе 9GAG Свежая категория: Новые записи всегда на вершине (легко). НО в моем приложении предыдущие, скорее всего, больше никогда не будут замечены, то есть я хочу избежать повторения. Поэтому он должен расставлять приоритеты в отношении новых записей, и когда нет новых "Карт", он будет продолжаться там, где вы в последний раз останавливались.

Извините за текст! И спасибо за любую обратную связь! :)

Теги:
google-app-engine
google-cloud-datastore
cursor
jdo

2 ответа

0
Лучший ответ

Спасибо @Bharath за то, что вдохновили меня/заставили меня думать другими способами. Мое решение вдохновлено вашим решением. Однако ваше решение было слишком упрощенным, поскольку я мог получать только самые новые записи, в то время как я действительно хотел старых, если не было новых, и они могли бы вернуться к предыдущей позиции.

Мое решение работает следующим образом:

Если у меня есть записи: C5, C4, C3, C2, C1. Они сортируются по ASC, что означает, что это самая новая запись.

Как и в примере в OP, я хочу получить 3 карты. Затем я извлекаю C5, C4 и C3 и сохраняю временную метку C5 как "новейшее время" и сохраняю временную метку C3 как "oldestTime" на клиенте. С этими двумя я могу моделировать поведение курсора в хранилище данных.

В следующий раз, когда я получаю Карты, я сначала пытаюсь получить Карты с отметкой времени больше, чем "newestTime", что означает, что они новее. Если я получу меньше трех результатов, я попытаюсь получить оставшееся количество Карт, получив Карты, у которых есть отметка времени, которая ниже, чем "oldestTime", что означает, что они являются вопросами, которые я не получил. Таким образом, "oldestTime" работает как курсор, указывающий на последнюю введенную вами запись. Когда запросы "newestTime" и "oldestTime" возвращают менее трех результатов, это означает, что больше нет "невидимых" результатов, что означает, что мы должны перезапускаться с самого начала, поэтому мы извлекаем оставшиеся Карты из begin (и принудительно обновить "oldestTime"). Результатом точного поведения я описал в OP.

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

1

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

  1. передать текущее время (мс) в запрос и создать курсор.
  2. Получите сущности, созданные до того, как вы прошли.
  3. сохраните время (мс), которое вы передали в первый раз на стороне клиента, и передавайте его каждый раз.
  4. При этом вы можете игнорировать объекты, созданные после вашего первого запроса.
  • 0
    Спасибо за ваш вклад! Я посмотрю, смогу ли я найти решение моей проблемы с этим подходом. Даже не рассматривал использование временной метки как ограничителя результатов. Я вернусь и опубликую свои результаты!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню