1. ホーム
  2. javascript

[解決済み] DynamoDBで予約キーワードをFilterExpressionとしたスキャン関数 NodeJS

2022-02-15 03:25:30

質問

私のスキャン機能 :

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 }

今、私は、予約されたキーワードを使用しようとしている点を理解します。 を使用した場合、不正なフィルター式になります。 しかし、同じ関数をaws guiで実行すると、見事にデータが返ってきます(詳細は画像をご確認ください)。 GUIによるステータスのスキャン機能

そこで質問ですが、キー名を変更することなく、ノードを通してフィルター式を追加するにはどうすればよいのでしょうか?

解決方法は?

解決済みです。

aws-sdkが受け取るパラメータは2つあります。

式属性名

式属性の値

は、どちらも属性リストで使用されているプレースホルダーを置き換える機能を提供します。 ここで、Attributesというのは少し曖昧で、私が混乱したところです。 awsのウィザードたちは、属性という言葉を使うとき、キーと値の両方を意味しています。

そのため、予約されたキーワードをキー属性として使用したい場合は、Expression Attribute Name パラメータに #(pound) を付けてプレースホルダーを表します。

同様に、値属性にプレースホルダーを使用したい場合は、Expression Attribute Valueパラメータに:(コロン)を付けてプレースホルダーを表します。

というわけで、最終的に私のコード(動作中)は次のようになります。

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