Powiedzmy mam to naprawdę proste rodzic/dziecko relatiosnship (dowolny Answer
instancje klasy zawsze ma Question
rodzica):Google NDB: Najlepszy sposób odczytywania encji podrzędnych z obiektu, powtarzanych właściwości w porównaniu do zwykłych zapytań?
class Answer(ndb.Model):
content = ndb.StringProperty()
timestamp = ndb.DateTimeProperty()
def to_message():
"""Returns a protoRPC message object of the answer"""
class Question(ndb.Model):
content = ndb.StringProperty()
answers = ndb.KeyProperty(repeated = True, kind = 'Answer')
def to_message(self):
"""Returns a protoRPC message object of the question"""
Dwa to message
metody są po prostu wykorzystywane do powrotu obiektu protoRPC. Pytanie brzmi: w moim sposobie to_message
w klasie Question
, jeśli chcę, aby pobrać wszystkie dzieci Answer
instancji, pobierać je i wykorzystywać własną metodę to_message
aby je w ładnym rpc Wiadomość jest lepiej:
- iteracyjne nad
anwers
powtórzone listy KeyProperty - Wykonaj zapytanie przy użyciu filtra na „macierzystej” własności i iteracyjne nad listy wyprowadza
Pod względem dostępu NDB, pierwsza metoda wydaje być najlepszym, ale ponieważ i tak przekroczymy wolny limit, zastanawiam się, czy magazyn danych nie jest bardziej wydajny w pobieraniu rzeczy niż ja, iterując po tej liście.
Edytuj: Pierwotne pytanie ma bardzo prostą i oczywistą odpowiedź: pierwszy sposób. Prawdziwe pytanie byłoby, na wypadek, gdyby musiałem odfiltrować niektóre jednostki Answer
na podstawie ich atrybutów (na przykład timestamp
): czy lepiej jest wyszukiwać za pomocą filtru, czy iterować po liście i używać warunku do zbierania tylko " ciekawe "byty?
Dzięki za odpowiedź ... Myślę, że moje obecne pytanie jest trochę głupie. Prawdziwe pytanie brzmi: wyobraź sobie, że mam listę kluczy i chcę uzyskać listę jednostek odfiltrowanych przez pewien warunek na jednym z ich atrybutów (na przykład wartość znacznika czasowego). Czy bardziej wydajne jest zapytanie lub powtórzenie listy? – hadware
W takim przypadku ze swoim schematem nie można wykonać zapytania. Powinieneś iterować po wszystkich encji i filtrować za pomocą kodu Pythona. Inną opcją jest użycie 'KeyProperty (Question)' w 'Answer' jak w powyższym przykładzie. W takim przypadku możesz filtrować odpowiedzi według pytania, a także inne atrybuty w tym samym zapytaniu. Ostatnia opcja jest tańsza (i szybsza), ponieważ pobierasz tylko odpowiedzi, których potrzebujesz. –
Trzecia (lub czwarta, jeśli zlicza się przodków) opcja używa [Structured Property] (https://developers.google.com/appengine/docs/python/ndb/properties#structured). Jak wszystko ma plusy i minusy. –