1

Ich habe eine Entität mit mehr als 25 Eigenschaften. Von diesen 25 werden 15 Eigenschaften in der Frontend-Tabelle angezeigt. Diese Tabelle ermöglicht es, eine Sortierung (beide ASC & DESC) für jede Eigenschaften durchzuführen.Individuelle Datasore Abfrage oder für große Anzahl von Eigenschaften

Um dies im Backend zu behandeln, überprüfe ich den Auftragstyp und schreibe Abfrage für jede Eigenschaft für ASC und DESC Reihenfolge. Um die 15 Datensätze sortieren zu können, habe ich eine Menge Zeilencode, der ähnlich aussieht. Einziger Unterschied ist der Auftragstyp.

-Code sieht wie folgt aus:

@classmethod 
def retrieve(cls, order, limit, offset): 
    if order == '-property_1': 
     results = cls.query(ancestor=parent).order(-cls.property_1).fetch(limit, offset=offset) 
    elif order == 'property_1': 
     results = cls.query(ancestor=parent).order(cls.property_1).fetch(limit, offset=offset) 
     . 
     . 
     . 
     . 
    elif order == '-property_15': 
     results = cls.query(ancestor=parent).order(-cls.property_15).fetch(limit, offset=offset) 
    elif order == 'property_15': 
     results = cls.query(ancestor=parent).order(cls.property_15).fetch(limit, offset=offset) 

Und seine Erstellung 2-Datenspeicher-Index für jede Eigenschaft.

- kind: EntityName 
    ancestor: yes 
    properties: 
    - name: property_1 

- kind: EntityName 
    ancestor: yes 
    properties: 
    - name: property_1 
    direction: desc 

Meine Frage hier ist Gibt es eine bessere Möglichkeit, diesen Fall zu behandeln?

Antwort

2

Wenn die Parameter Sie vorbei immer Ihr Eigenschaftsnamen übereinstimmen, dann können Sie ersetzen Ihre if-Anweisungen mit so etwas wie:

desc = False 
if order[0] == '-': 
    order = order[1:] 
    desc = True 

query = cls.query(ancestor=parent) 
order = getattr(cls, order) 
if desc: 
    order = -order 

query = query.order(order) 
results = query.fetch(limit, offset=offset) 
1

Nein, Sie verarbeiten die Indexierung in der richtigen Weise.

Wenn Ihre Daten kleiner und im Wachstum relativ begrenzt sind, können Sie zur clientseitigen Sortierung wechseln, wenn Sie die Erstellung von 15 * 2 Indizes vermeiden möchten.

Alternativ, wenn die Anzahl der Eltern (Entity-Gruppen) klein ist und Sie mit eventueller Konsistenz leben können, könnten Sie die awestern = parent-Klausel auslassen und einfach nach Eltern im Client filtern. Dadurch können Sie die integrierten Indizes für Eigenschaften (beide Anweisungsrichtungen) verwenden und benötigen keine zusammengesetzten Indizes.

+0

Die erste Zeile dieser Antwort scheint unnötig wiederholende Code zu fördern; Es gibt eindeutig einen besseren Weg, dies zu tun (siehe Gregs Antwort). – ChrisC73

+0

@ ChrisC73 Ich habe nur den Indexierungs/Abfrage-Aspekt diskutiert - ich habe die erste Zeile aktualisiert, um das zu reflektieren. –

+0

vereinbart; Die potentielle Anzahl der erforderlichen Indizes ist definitiv ein Problem – ChrisC73

Verwandte Themen