2015-08-04 4 views
6

Ich lerne, wie Ergebnisse von einem Scan oder einer Abfrage mit Amazons DynamoDB gefiltert werden. Ich würde erwarten, dass ein Beispielfilter wie filter => name = Bob oder ähnliches aussieht. Allerdings erfordert Amazon die Verwendung eines Ausdrucks wie zum Attribut als filter => name = :person und dann ExpressionAttributeValues => { ":person": {"S": "Bob"}}Warum benötigt DynamoDB expressionAttributeValue?

Dies ist verwirrend und schmerzt mein Kopf, warum kann ich nicht die einfache name = Bob benutzen?


Offizielle Dokumente: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#FilteringResults

Offenbar Arbeitsbeispiel in der Nähe von Ende: https://github.com/aws/aws-cli/issues/1073

Antwort

9

Diese Art der Syntax folgt einen Ansatz, der auf vorbereitete Anweisungen ähnlich ist, die in SQL-Systemen verwendet werden. Dies war eine Designentscheidung, die das DynamoDB-Team von AWS getroffen hat. Einer der Gründe besteht darin, Felder zuzulassen, die in Konflikt mit der langen Liste von reserved words stehen (einschließlich "name", die Sie in Ihrem Beispiel verwendet haben), die von DynamoDB definiert werden.

Das Vermeiden von reservierten Wörtern wird tatsächlich ausgeführt, indem das ExpressionAttributeNames-Attribut verwendet und die Attributnamen angegeben werden. Sie haben auf ExpressionAttributeValues ​​verwiesen, wo die Liste der Werte angegeben ist. Weitere Informationen finden Sie auf der Dokumentationsseite Using Placeholders for Attribute Names and Values.

Eine weitere Motivation dieses Entwurfs besteht darin, die Anweisung von den Parameternamen und -werten zu trennen, ähnlich den vorbereiteten Anweisungen in SQL, wie ich bereits erwähnt habe. Auch wenn dies auf den ersten Blick merkwürdig erscheint, hat es den zusätzlichen Vorteil, dass Sie Ihre Eingaben im NoSQL-Sinn effektiv bereinigen und mögliche böswillige oder unbeabsichtigte Probleme mit Ihren Benutzereingaben vermeiden, die sich auf das Verhalten Ihrer Anfrage bei der Interaktion mit DynamoDB auswirken.