私のスキャン機能:
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 }
これで、不正なfilterExpressionで予約済みキーワードを使用しようとしていることがわかります。しかし、aws guiを介して同じ関数を実行すると、データが美しく返されます(詳細は画像を確認してください): guiを介してステータスの関数をスキャン
したがって問題は、キー名を変更せずにノードを介してフィルター式を追加するにはどうすればよいですか?
解決済み:
Aws-sdkが取る2つのパラメーターがあります。
式属性名
式属性値
どちらも、属性リストで使用されているプレースホルダーを置き換える機能を提供します。ここでは、Attributesによって少しあいまいになり、混乱しました。 awsでのウィザードは、用語属性を使用するときのキーと値の両方を意味します。
したがって、予約済みのキーWordをキー属性として使用する場合は、式属性名パラメーターを#(pound)とともに使用して、プレースホルダーを示します。
同様に、値属性にプレースホルダーを使用する場合は、式属性値パラメーターを:(colon)とともに使用して、プレースホルダーを示します。
だから最後に私のコード(動作)は次のようになります:
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
プレースホルダーについても同じようにする必要があります。予約済みのWordについてはエラーメッセージに何も表示されないので、それがエラーの原因であると考える理由がわかりません。このエラーは、:status
プレースホルダーの値を提供していないことを具体的に示しています。