2016-10-19 11 views
0

Ich möchte einen DynamoDB Scan mit der folgenden Logik implementieren:Wie kann ich DynamoDB Limit nach dem Filtern tun?

Scanning -> Filterung (boolean true oder false) -> Die Begrenzung (für Paginierung)

Allerdings habe ich in der Lage, nur implementieren einen Scan mit dieser Logik:

Scanning -> Begrenzung (für Paginierung) -> Filter (boolean wahr oder falsch)

Wie kann ich das erreichen?

Unten ist ein Beispiel, das ich geschrieben habe, dass die zweite Scan-Logik implementiert:

var parameters = { 
     TableName: this.tableName, 
     Limit: queryStatement.limit 
    }; 
    if ('role' in queryStatement) { 
     parameters.FilterExpression = '#role = :role'; 
     parameters.ExpressionAttributeNames = { 
      '#role': 'role' 
     }; 
     parameters.ExpressionAttributeValues = { 
      ':role': queryStatement.role 
     }; 
    } 
    if ('startKey' in queryStatement) { 
     parameters.ExclusiveStartKey = { id: queryStatement.startKey}; 
    } 

    this.documentClient.scan(parameters, (errorResult, result) => { 
     if (errorResult) { 
      errorResult._status = 500; 
      return reject(errorResult); 
     } 

     return resolve(result); 
    }); 

Diese Codes wie zweite arbeitet.

Scanning -> Begrenzung -> Filterung

Antwort

3

Das DynamoDB LIMIT wie unten erwähnt arbeitet (das heißt zweiter Ansatz in Ihrem Beitrag) nach Design. Da es funktioniert, gibt es dafür keine Lösung.

LastEvaluatedKey sollte verwendet werden, um die Daten bei nachfolgenden Scans zu erhalten.

Scanning -> Begrenzung (für Paginierung) -> Filter (boolean wahr oder falsch)

In einer Anfrage, stellen Sie den Grenzwert Parameter auf die Anzahl der Elemente, die Sie DynamoDB möchten, bevor die Verarbeitung Ergebnisse zurückgeben.

In einer Antwort gibt DynamoDB alle übereinstimmenden Ergebnisse innerhalb des Bereichs des Grenzwerts zurück. 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 in den ersten sechs zurück, die ebenfalls den Filteranforderungen entsprechen (die Anzahl der zurückgegebenen Ergebnisse ist kleiner oder gleich 6).

Für einen Abfrage- oder Scanvorgang gibt DynamoDB möglicherweise einen LastEvaluatedKey-Wert zurück, wenn der Vorgang nicht alle übereinstimmenden Elemente in der Tabelle zurückgegeben hat. Nehmen Sie den LastEvaluatedKey Wert aus der vorherigen Anforderung und verwenden Sie es als den ExclusiveStartKey Wert in der nächsten Anforderung, um die vollständige Anzahl der Elemente zu erhalten, die übereinstimmen. Wiederholen Sie dies bis DynamoDB gibt nicht länger einen LastEvaluatedKey-Wert zurück.

+0

Oh, du meinst, es gibt keine Lösung für dieses Problem zu lösen (?) Nicht wahr? weil DynamoDB dies beabsichtigt. Ich benutze LastEvaluatedKey für die Paginierung, wie http://blabla.com/users/?limit=10&startKey= '' startKey von LastEvaluatedKey erhalten. Ich möchte 10 Daten pro HTTP-Antwort bekommen, weil ich Limit = 10 gesetzt habe, aber es kann nicht aus dem oben genannten Grund richtig? – 101110101100111111101101

+0

Danke, für Ihre Antwort, und ich muss einen anderen Weg finden, um dies zu lösen. – 101110101100111111101101

+0

Gut. Ja, aus dem oben genannten Grund (d. H. Zweiter Absatz letzter Satz in der Klammer). Sie müssen LastEvaluatedKey verwenden, bis Sie 10 erwartete Datensätze erhalten. Das Limit in Dynamodb funktioniert im Vergleich zu RDBMS anders. – notionquest

0

limts fügt jetzt in DynamoDB

var params = { 
     TableName: "message", 
     IndexName: "thread_id-timestamp-index", 
     KeyConditionExpression: "#mid = :mid", 
     ExpressionAttributeNames: { 
      "#mid": "thread_id" 
     }, 
     ExpressionAttributeValues: { 
      ":mid": payload.thread_id 
     }, 
     Limit: (3 , 2 ,3), 
     LastEvaluatedKey: 1, 
     ScanIndexForward: false 
    }; 
    req.dynamo.query(params, function (err, data) { 
console.log(err, data); 
}) 
Verwandte Themen