2015-07-27 11 views
6

In meiner Android App möchte ich Daten von DynamoDB abfragen. Es wird tausend übereinstimmende Gegenstände geben, aber ich möchte nur die ersten 10 von ihnen bekommen. Ich weiß nicht, wie ich dieses Limit setzen soll. Ich habe diese Zeilen in der Dokumentation gefunden:Wie kann das Limit für übereinstimmende Elemente festgelegt werden, die von DynamoDB mit Java zurückgegeben werden?

Die Abfrage- und Scan-APIs von DynamoDB erlauben einem Limit-Wert, die Größe der Ergebnisse einzuschränken.

Legen Sie in einer Anforderung den Parameter Limit auf die Anzahl der Elemente fest, die DynamoDB verarbeiten soll, bevor Ergebnisse zurückgegeben werden.

In einer Antwort gibt DynamoDB alle übereinstimmenden Ergebnisse im Rahmen des Grenzwerts zurück. Wenn Sie beispielsweise eine Abfrage oder eine Scananforderung mit einem Grenzwert von 6 und ohne Filterausdruck absetzen, gibt DynamoDB die ersten sechs Elemente in der Tabelle zurück, die den angegebenen Schlüsselbedingungen in der Anforderung entsprechen (oder nur die ersten sechs Elemente in der Fall eines Scan ohne Filter). Wenn Sie auch einen FilterExpression-Wert angeben, gibt DynamoDB die Elemente in den ersten sechs zurück, die ebenfalls den Filteranforderungen entsprechen (die Anzahl der zurückgegebenen Ergebnisse ist kleiner oder gleich 6).

Aber ich kann nicht den Weg finden, die Grenze für die Antwort zu setzen. Ich fand die Methode SetCount von queryresult:

QueryResult result2 = dynamodb.query(request); 
    result2.setCount(5); 

Es wird gesagt, dass: dann Count ist die Anzahl der Einzelteile zurück, nachdem der Filter

angelegt war, aber ich denke, es ist nicht das, was ich will. Da DynamoDb vor dem Aufruf von setCount immer noch alle übereinstimmenden Elemente zurückgibt. Kann mir jemand helfen?

+0

Sie benötigen ich AWS SDK verwenden erraten http://docs.aws.amazon.com/amazondynamodb /latest/developerguide/QueryJavaDocumentAPI.html – kosa

+0

@Nambari Könnten Sie mir bitte weitere Informationen geben? Ich sehe die Limit-Klausel in Ihrem Link nicht. – TOP

+0

https://mobile.awsblog.com/post/Tx1U4RV2QI1MVWS/Amazon-DynamoDB-on-Mobile-Part-1-Loading-Data – kosa

Antwort

2

Sie müssen das Limit als Teil der Anforderung anwenden, die Sie an die API und nicht an die Antwort senden.

Ich nehme an, dass das Anfrageobjekt, das Sie an das Dynamodb-Objekt senden, eine QuerySpec ist. Was Sie tun möchten, ist Anruf withMaxResultSize, um das Limit zu übergeben, das angewendet werden soll, bevor die Abfrage gegen die API ausgeführt wird.

jedoch, wie Sie in Ihrer Frage erwähnt müssen Sie sicherstellen, dass Sie das Verhalten der Grenze zu verstehen, wie in der DynamoDB Dokumentation auf Limits beschrieben:

In einer Antwort, DynamoDB gibt alle passenden Ergebnisse innerhalb der Bereich des Grenzwerts. Beispiel: Wenn Sie eine Abfrage oder eine Abfrage mit einem Grenzwert von 6 und ohne Filterausdruck ausgeben, gibt DynamoDB die ersten sechs Elemente in der Tabelle zurück, die den in der Anforderung angegebenen Schlüsselbedingungen entsprechen (oder nur die erste sechs Artikel im Falle eines Scan ohne Filter). Wenn Sie auch einen FilterExpression-Wert angeben, gibt DynamoDB die Elemente im ersten six zurück, die ebenfalls den Filteranforderungen entsprechen (die Anzahl der zurückgegebenen Ergebnisse ist kleiner oder gleich 6).

Das bedeutet, dass wenn Sie keine FilterExpression verwenden, Sie wahrscheinlich in Ordnung sind. Wenn Sie jedoch die Ergebnisse filtern, erhalten Sie wahrscheinlich weniger als Ihr Limit, da das Limit technisch nicht die Anzahl der Ergebnisse ist, die zurückgegeben werden, sondern die Anzahl der Elemente, die DynamoDB möglicherweise zurückgibt.

Es klingt, als ob Sie nach einer Methode fragen, mit der DynamoDB die Anzahl der zurückgegebenen Ergebnisse auf eine exakte Zahl begrenzt, während FilterExpression angewendet wird. Leider ist dies derzeit mit DynamoDB nicht möglich.

+1

Vielen Dank. Ich verstehe. Momentan möchte ich DynamoDBQueryExpression und DynamoDBMapper verwenden, um Items zu erhalten. Aber die Methode setLimit (integer) von DynamoDBQueryExpression funktioniert nicht. Wenn ich beispielsweise setLimit (10) aufruft, gibt es immer noch alle 50 übereinstimmenden Elemente zurück. – TOP

+0

Ich glaube nicht, dass setLimit die richtige Methode ist. Sie sollten in der Lage sein, mit MaxResultSize in der QuerySpec aufzurufen, um das Limit anzugeben, damit es als Teil der Anfrage angewendet wird. Wenn es immer noch nicht funktioniert, kann ein zusätzliches Code-Snippet zur Klärung beitragen. – JaredHatfield

+0

Die [docs] (http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/dynamodbv2/datamodeling/DynamoDBQueryExpression.html#setLimit (java.lang.Integer)) für DynamoDBQueryExpression. setLimit sagt ausdrücklich "Beachten Sie, dass beim Aufruf von DynamoDBMapper.query mehrere Anforderungen an DynamoDB gesendet werden, um die gesamte Ergebnismenge abzurufen. Dadurch wird die Anzahl der abgerufenen Elemente begrenzt, NICHT die Gesamtzahl der Ergebnisse, die abgerufen werden Verwenden Sie DynamoDBMapper.queryPage, um eine einzelne Seite von Elementen aus DynamoDB abzurufen. " –

0

Dies ist, wie Sie ver 1.10.61 ein Abfrageergebnis mit aws-java-sdk begrenzen

import com.amazonaws.AmazonClientException; 
import com.amazonaws.auth.AWSCredentialsProvider; 
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain; 
import com.amazonaws.regions.Region; 
import com.amazonaws.regions.Regions; 
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBAsyncClient; 
import com.amazonaws.services.dynamodbv2.document.DynamoDB; 
import com.amazonaws.services.dynamodbv2.document.Item; 
import com.amazonaws.services.dynamodbv2.document.ItemCollection; 
import com.amazonaws.services.dynamodbv2.document.QueryOutcome; 
import com.amazonaws.services.dynamodbv2.document.spec.QuerySpec; 



AWSCredentialsProvider provider = new DefaultAWSCredentialsProviderChain(); 
AmazonDynamoDBAsyncClient client = new AmazonDynamoDBAsyncClient(provider); 
Region region = Region.getRegion(Regions.fromName(DYNAMODB_REGION)); 
client.setRegion(region); 
dynamoDB = new DynamoDB(client); 

QuerySpec querySpec = new QuerySpec(); 

/* MAX 1 item */ 
querySpec.setMaxResultSize(1); 

querySpec.withHashKey("myPartitionKeyName", partitionKeyValue); 

ItemCollection<QueryOutcome> query = dynamoDB.getTable(DYNAMODB_TABLE).query(querySpec);