1

Nehmen wir an, ich das Modell Foo in GAE haben und diese Abfrage.wie die n-te Datensatz einer Datenspeicher-Abfrage bekommen

query = Foo.all(), um ('- Schlüssel')

Ich möchte den n-ten Datensatz bekommen. Was ist der effizienteste Weg, um das zu erreichen?

Wird die Lösung Pause, wenn die Ordnungseigenschaft nicht eindeutig, wie das unten ist:

query = Foo.all(), um ('- Farbe')

bearbeiten: n. > 1000

bearbeiten 2: Ich möchte einen freundlichen Paging-Mechanismus entwickeln, der Seiten verfügbar zeigt (wie Seite 1, Seite 2, ... Seite 185) und erfordert eine "? Page = x" in der Abfragezeichenfolge, anstelle eines "? Bookmark = XXX". Wenn page = x, soll die Abfrage die Datensätze ab dem ersten Datensatz dieser Seite abrufen.

Antwort

3

Es gibt keine effiziente Art und Weise zurückkehren würde zu Mach das - in jedem DBMS. In jedem Fall müssen Sie mindestens sequentiell durch die Indexsätze lesen, bis Sie die n-te finden, und dann den entsprechenden Datensatz nachschlagen. Dies ist mehr oder weniger was fetch (count, offset) in GAE macht, mit der zusätzlichen Beschränkung von 1000 Datensätzen.

Ein besserer Ansatz besteht darin, ein "Lesezeichen" zu erstellen, das aus dem Wert des Felds, für das Sie bestellen, und dem Schlüssel der Entität besteht. Wenn Sie dann an der Stelle weitermachen möchten, an der Sie aufgehört haben, können Sie den Wert des Felds als Untergrenze einer Ungleichheitsabfrage hinzufügen und Datensätze überspringen, bis Sie mit der zuletzt angezeigten übereinstimmen oder diese überschreiten.

Wenn Sie Benutzern benutzerfreundliche Seitenoffsets bereitstellen möchten, können Sie Memcache verwenden, um eine Verknüpfung zwischen einem Startoffset und einem Tupel mit einem Lesezeichen (Bestelleigenschaft, Schlüssel) zu speichern. Wenn Sie eine Seite erstellen, fügen Sie das Lesezeichen für das Objekt ein, das dem letzten folgt, oder aktualisieren Sie es. Wenn Sie eine Seite abrufen, verwenden Sie das Lesezeichen, falls vorhanden, oder generieren Sie es auf die harte Tour, indem Sie Abfragen mit Offsets ausführen - möglicherweise mehrere Abfragen, wenn der Offset hoch genug ist.

+0

Entschuldigung, dass ich nicht ausreichend geklärt habe, was ich beabsichtigt habe. Bitte überprüfen Sie meine Frage, ich habe eine Bearbeitung vorgenommen. – shanyu

+0

Aktualisierte meine Antwort mit mehr Details zu diesem Zweck. –

2

Dokumentation für die Abfrageklasse finden sich unter: http://code.google.com/appengine/docs/python/datastore/queryclass.html#Query

Die Abfrageklasse holen liefert Hexe eine Grenze nimmt und eine Offset- in Ihrem Fall 1 und n

Die Laufzeit des Abrufs wächst linear mit dem Offset + der Grenze

so die einzige Möglichkeit zur Optimierung in Ihrem Fall wäre, um sicherzustellen, dass die Datensätze Zugriff am häufigsten sind näher am Anfang des Arrays.

könnten Sie verwenden query.filter ('key =', n) query.get()

, die das erste Spiel mit einem Schlüssel von n

+0

Entschuldigung, dass ich nicht ausreichend geklärt habe, was ich beabsichtigt habe. Bitte überprüfen Sie meine Frage, ich habe eine Bearbeitung vorgenommen. – shanyu

+0

Sie können keinen Filter auf "Schlüssel" anwenden, um nach einem Schlüssel zu filtern - Sie müssen die Pseudo-Eigenschaft __key__ verwenden. In jedem Fall ist ein solcher Filter bedeutungslos - er gibt nur ein Ergebnis zurück, daher wäre es effizienter, Model.get zu verwenden. –

Verwandte Themen