65

My scan function :

var tableName = 'faasos_orders',
    filterExp = 'status = :delivered OR status = :void OR status = :bad',
    projectionValues = '',
    expressionAttr = {};    
    expressionAttr[":delivered"] = "delivered";
    expressionAttr[":bad"] = "bad";
    expressionAttr[":void"] = "void"; 
    limit = 10;
  dynamoConnector.getItemUsingScan(tableName, filterExp, projectionValues, expressionAttr, function (err, data) {  ...........} 

Error on running :

    { [ValidationException: Invalid FilterExpression: Attribute name is a reserved keyword; reserved keyword: status]
  message: 'Invalid FilterExpression: Attribute name is a reserved keyword; reserved keyword: status',
  code: 'ValidationException',
  time: Mon Apr 18 2016 21:57:30 GMT+0530 (IST),
  requestId: 'AV6QFHM7SPQT1QR3D4OO81ED4FVV4KQNSO5AEMVJF66Q9ASUAAJG',
  statusCode: 400,
  retryable: false,
  retryDelay: 0 }

Now I do get the point I am trying to use a reserved keyword in th e filterExpression which is illegal. But if I run the same function through aws gui it returns data beautifully (check image for details): Scan function on status through gui

So the question is how do I add the filter expression through node without having to change the key name ???

2 Answers 2

142

Solved :

There are two parameters taken by aws-sdk :

Expression Attribute Name

Expression Attribute Value

both provide the functionality of replacing placeholders used in the attributes list. Here by Attributes it is a bit ambiguous, where I got confused. The wizards over at aws mean both the key and value when they use the term attribute.

So in a case where you want to use a reserved key word as a key attribute use the Expression Attribute Name parameter with #(pound) to denote the placeholder.

Similarly where you want to use placeholders for value attribute use the Expression Attribute Value parameter with :(colon) to denote the placeholder.

So finally my code (working) looks like this :

var param = {
  TableName: "faasos_orders",
  FilterExpression: "#order_status = :delivered OR #order_status = :void OR #order_status = :bad",
  ExpressionAttributeValues: {
    ":delivered": "delivered",
    ":void": "void",
    ":bad": "bad"
  },
  ExpressionAttributeNames: {
    "#order_status": "status"
  }
};  
  dynamodb.scan(param, function (err, data) {....});
Sign up to request clarification or add additional context in comments.

5 Comments

Thank you for your effort. Had a similar error. :-)
Yay. Amazons Documentation is just so awesome you know. Though found this their main guide for DynamoDB : Dev Guide Latest Amazon dynamodb @kometen
This also works in C# (with a slight syntax change) and presumably all other languages supported by the aws sdks.
Here is the c# syntax @ElliotBlackburn mentioned docs.aws.amazon.com/sdk-for-net/v2/developer-guide/…
This worked. Thanks
3

:status is a placeholder in your expression that you aren't providing a value for. See how you are providing values for your other placeholders here:

expressionAttr[":delivered"] = "delivered";
expressionAttr[":bad"] = "bad";
expressionAttr[":void"] = "void"

You need to do the same for the :status placeholder. I don't see anything about a reserved word in the error message, so I'm not sure why you think that's the cause of the error. The error very specifically states that you aren't providing a value for the :status placeholder.

5 Comments

Please see the edits . had been toying with the placeholder as explained here docs.aws.amazon.com/amazondynamodb/latest/developerguide/… Though neither #status nor :status seems to work , { [ValidationException: ExpressionAttributeValues contains invalid key: Syntax error; key: "#status"] And with :status the expression though runs smoothly but returns no data
You have to use the placeholder syntax like in your original question text, but then you also need to provide the value for that placeholder: expressionAttr[":status"] = "status"
That doesnt match the condition mate. No value is returned. Though I have values in the db as shown on image. The aws doc says to use # for expression attribute names and : for expression attribute values.
Then use # and see if it works? The fact is you have to provide a value for any placeholders you put in the query, which is what the error message is complaining about.
Old post but it seems to need some clarification. The error message specifically mention an error about a reserved keyword! "Status" is a reserved keyword per documentation (docs.aws.amazon.com/amazondynamodb/latest/developerguide/…) . That's why you needed to use the ExpressionAttributeNames to be still be able to use the attribute "status" in the filter as below.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.