Используйте "ANCESTOR IN <list>" в запросе AppEngine - PullRequest
3 голосов
/ 18 августа 2011

У меня есть объекты типа A и B, где A имеет много B (один ко многим).

Я использую его по двум причинам

  1. Чтобы иметь возможность совершать транзакции в группе лиц
  2. Найти все объекты B, являющиеся потомками, для списка объектов A

Для размещения (1) мне нужно, чтобы A был родительским для B. Могу ли я использовать это отношение также для выполнения запроса (2)? Этот запрос будет фильтром "ANCESTOR IN", это возможно?

Иначе я бы сохранил отношения двумя способами, как родительский, а во-вторых, как обычное свойство?

1 Ответ

3 голосов
/ 18 августа 2011

Существует оператор no ANCESTOR IN, только ANCESTOR IS - другими словами, вы можете легко найти детей одного A, но не многих.Далее будут найдены все B сущности, которые являются потомками определенного A.

parent_key = db.Key.from_path('A', parent_key_name)
children_of_a = B.all().ancestor(parent_key).fetch(100)

Очень важно понимать, что все IN запросы в App Engine используютнесколько запросов за кулисами.Если вы добавляете родительское свойство для запроса и используете хранилище данных с высокой репликацией (так и должно быть), вам также необходимо понимать нюансы запросов к групповым объектам - они не будутбыть строго последовательным.Таким образом, если вы ожидаете очень небольшой список родителей (скажем, одного или двух) в большинстве случаев и вам нужна строгая согласованность, возможно, вам лучше выполнить несколько запросов предков.Если у вас, как правило, много родителей, и возможная последовательность нормальна, добавьте свойство, по которому можно запросить запрос.

...