Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does DynamoDB require expressionAttributeValue?

I'm learning about how to filter results from a scan or query using Amazon's DynamoDB. I would expect an example filter to look like filter => name = Bob or some such. However, Amazon requires the use of a expression attribute such as filter => name = :person and then ExpressionAttributeValues => { ":person": {"S": "Bob"}}

This is confusing and hurts my head, why can't I use the simple name = Bob?


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

Apparently working example near end: https://github.com/aws/aws-cli/issues/1073

like image 417
Anthony Elliott Avatar asked Aug 04 '15 18:08

Anthony Elliott


People also ask

What is the use of scan item option in DynamoDB?

A Scan operation in Amazon DynamoDB reads every item in a table or a secondary index. By default, a Scan operation returns all of the data attributes for every item in the table or index. You can use the ProjectionExpression parameter so that Scan only returns some of the attributes, rather than all of them.

What is difference between scan and Query in DynamoDB?

DynamoDB supports two types of read operations: Query and Scan. To find information, a query operation uses either the primary key or the index key. Scan, as the name implies, is a read call that scans the entire table for a specified result. DynamoDB is designed to be query-optimized.

What is ExclusiveStartKey in DynamoDB?

ExclusiveStartKey. The primary key of the first item that this operation will evaluate. Use the value that was returned for LastEvaluatedKey in the previous operation. The data type for ExclusiveStartKey must be String, Number, or Binary. No set data types are allowed.

What is Expressionattributenames in DynamoDB?

An expression attribute name is a placeholder that you use in an Amazon DynamoDB expression as an alternative to an actual attribute name. An expression attribute name must begin with a pound sign ( # ), and be followed by one or more alphanumeric characters.

What is an expression attribute name in DynamoDB?

Expression Attribute Names. An expression attribute name is a placeholder that you use in an Amazon DynamoDB expression as an alternative to an actual attribute name. An expression attribute name must begin with a pound sign (#), and be followed by one or more alphanumeric characters.

How do I compare an attribute with a value in DynamoDB?

If you need to compare an attribute with a value, define an expression attribute value as a placeholder. Expression attribute values in Amazon DynamoDB are substitutes for the actual values that you want to compare—values that you might not know until runtime.

What type does DynamoDB treat as a number type?

However, DynamoDB treats them as number type attributes for mathematical operations. An attribute of type Null. For example: An attribute of type String. For example:

What is NS attribute in DynamoDB?

However, DynamoDB treats them as number type attributes for mathematical operations. An attribute of type Number Set. For example: "NS": ["42.2", "-19", "7.5", "3.14"]


1 Answers

This type of syntax follows an approach that is similar to prepared statements that are used in SQL systems. This was a design decision that the DynamoDB team at AWS made. One of the reasons is to allow fields that conflict with the lengthy list of reserved words (including 'name' that you were using in your example) that are defined by DynamoDB.

Avoiding reserved words is actually performed by using the ExpressionAttributeNames attribute and specifying the attribute names. You were referencing ExpressionAttributeValues which is where the list of values is specified. More information is available on the Using Placeholders for Attribute Names and Values documentation page.

Another motivation of this design is to separate the statement from the parameter names and values, similar to prepared statements in SQL as I've already mentioned. While this may seem odd at first it has the added benefit of effectively sanitizing your inputs in a NoSQL sense avoiding possible malicious or unintentional problems with your user input affecting the behavior of your request on the interaction with DynamoDB.

like image 193
JaredHatfield Avatar answered Oct 07 '22 16:10

JaredHatfield