Функция сканирования в 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
местозаполнитель.