2017-09-05 4 views
0

ich AWS MobileHub verwende und ich eine DynamoDB Tabelle (userId, username, usertoplevel, usertopscore). Mein Partitionsschlüssel ist eine Zeichenkette (userId) und ich habe einen globalen Suchindex (GSI) erstellt, in dem ich usertoplevel als Partitionsschlüssel und usertopscore als Sortierschlüssel mache. Ich kann für alle Einzelteile durch den folgenden Code erfolgreich abfragenBegrenzung und Bestellung des Scan Ergebnis AWS

final DynamoDBScanExpression scanExpression = new DynamoDBScanExpression(); 
      List<UserstopcoreDO> results; 
      DynamoDBMapper mapper = AWSMobileClient.defaultMobileClient().getDynamoDBMapper(); 
      results = mapper.scan(UserstopcoreDO.class, scanExpression); 
      for (UserstopcoreDO usertopScore : results) { 
       Logger.d("SizeOfUserScore : " + usertopScore.getUsertopscore()); 
      } 

Jetzt habe ich 1500 Datensätze in der Tabelle, und ich möchte das Ergebnis begrenzen nur die Top 10 der Benutzer zu holen. Ich werde dankbar sein, wenn jemand hilft.

Antwort

2

Um dies zu erreichen, müssen Sie sich von Scan entfernen und die Query-Operation verwenden. Die Abfrageoperation bietet Ihnen die Möglichkeit anzugeben, ob der Index vorwärts oder rückwärts gelesen werden soll. Um die ersten 10 Ergebnisse zu erhalten, müssen Sie die zurückgegebenen Ergebnisse auf 10 beschränken. Dies kann durch Festlegen eines Limits für Ihre Abfrageoperation erfolgen. Daher zusammenzufassen:

  1. Beginnen Sie mit einer Abfrageoperation anstelle von Scan.
  2. Legen Sie scanIndexForward auf false fest, um die Ergebnisse in absteigender Reihenfolge zu lesen.
  3. Legen Sie ein Limit für Ihre Abfrageoperation fest, um die Top 10 Ergebnisse zurückzugeben.

Diese Seite beschreibt alle Dinge, die ich in dieser Antwort erwähnt: http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html

+0

aber das Problem in der Abfrage ist, ich muss Hash-Schlüssel setzen und in meiner Bedingung gibt es keinen Hash-Schlüssel zu setzen, wenn ich nicht Hash-Schlüssel gesetzt, geben Sie mir einen Fehler "Keine Hash-Schlüssel Bedingung in der Abfrage gefunden" so wie um diesen Zustand zu bewältigen –

-1

Die Grenze kann im Scan-Ausdruck festgelegt werden. Bitte lesen Sie die Definition des LIMIT sorgfältig durch. Es ist das Limit für die maximale Anzahl von auszuwertenden Elementen. Sie müssen sich jedoch keine Sorgen machen, wenn beim Scan kein Filterausdruck verwendet wird.

Falls Sie einen Filterausdruck verwenden, müssen Sie möglicherweise einen rekursiven Scan durchführen, bis LastEvaluatedKey null ist.

DynamoDBScanExpression scanExpression = new DynamoDBScanExpression().withLimit(10); 

Die maximale Anzahl von Elementen (nicht notwendigerweise die Anzahl der passenden Artikel ) zu bewerten. Wenn DynamoDB die Anzahl der Elemente bis zum Wert verarbeitet, während die Ergebnisse verarbeitet werden, wird der Vorgang gestoppt und werden die übereinstimmenden Werte bis zu diesem Punkt zurückgegeben, und in einem nachfolgenden Vorgang wird ein Schlüssel in LastEvaluatedKey auf angewendet, sodass Sie auswählen können oben, wo Sie aufgehört haben. Wenn die Größe des verarbeiteten Datensatzes 1 MB überschreitet, bevor erreicht wird, stoppt DynamoDB den Vorgang und gibt die übereinstimmenden Werte bis zum Grenzwert zurück, und in einem nachfolgenden Vorgang wird ein Schlüssel in LastEvaluatedKey auf angewendet, um den Vorgang fortzusetzen.

+0

Die Frage nach der OP nicht erscheint die Anzahl der Ergebnisse durch die Scan zurückgegeben werden zu beschränken, sondern die Top-X zu erhalten Ergebnisse basierend auf dem 'usertopscore' Schlüssel. – Dunedan

Verwandte Themen