Функция сканирования в DynamoDB с зарезервированным ключевым словом как FilterExpression NodeJS

моя функция сканирования :

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) {  ...........} 

ошибка при запуске:

    { [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 }

теперь я понимаю, что я пытаюсь использовать зарезервированное ключевое слово в th e filterExpression, которое является незаконным. Но если я запускаю ту же функцию через AWS gui, она возвращает данные красиво (проверьте изображение для деталей): функция сканирования по статусу через gui

Итак, вопрос в том, как добавить выражение фильтра через узел без изменения имени ключа ???

2 ответов


решила :

aws-sdk использует два параметра:

Имя Атрибута Выражения

Значение Атрибута Выражения

обеспечивают функции замены заполнителей, используемых в списке атрибутов. Здесь по атрибутам это немного неоднозначно, где я запутался. Мастера в aws означают как ключ, так и значение при использовании атрибута term.

таким образом, в случае, когда вы хотите использовать зарезервированное ключевое слово в качестве ключевого атрибута используйте параметр Expression Attribute Name с #(pound) для обозначения заполнителя.

аналогично, где вы хотите использовать заполнители для атрибута value используйте параметр значения атрибута Expression с: (двоеточием) для обозначения заполнителя.

Итак, наконец мой код (работает) выглядит так :

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) {....});

:status - это заполнитель в вашем выражении, для которого вы не предоставляете значение. Посмотрите, как вы предоставляете значения для других заполнителей здесь:

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

вам нужно сделать то же самое для :status местозаполнитель. Я не вижу ничего о зарезервированном слове в сообщении об ошибке, поэтому я не уверен, почему вы думаете, что это причина ошибки. Ошибка очень конкретно указывает, что вы не предоставляете значение для :status местозаполнитель.