web-dev-qa-db-ja.com

FilterExpression NodeJSとして予約済みキーワードを使用したDynamoDBのスキャン機能

私のスキャン機能:

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を介してステータスの関数をスキャン

したがって問題は、キー名を変更せずにノードを介してフィルター式を追加するにはどうすればよいですか?

17
Saleem Ahmed

解決済み:

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

:statusは、値を提供しない式のプレースホルダーです。ここで、他のプレースホルダーに値を提供する方法を確認してください。

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

:statusプレースホルダーについても同じようにする必要があります。予約済みのWordについてはエラーメッセージに何も表示されないので、それがエラーの原因であると考える理由がわかりません。このエラーは、:statusプレースホルダーの値を提供していないことを具体的に示しています。

3
Mark B