2016-04-18 24 views
3

マイスキャン機能として:ランニングにスキャン機能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: Scan function on status through gui

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

答えて

13

は解決:

をAWS-SDKで撮影した2つのパラメータがあります。

発現は名前

式が値

両方の属性のリストで使用されるプレースホルダを交換する機能を提供する属性属性。 ここでは属性によって少し曖昧で、混乱しています。 awsでのウィザードは、用語属性を使用するときにキーと値の両方を意味します。

予約されたキーワードをキー属性として使用する場合は、式属性名パラメータに#(ポンド)を付けてプレースホルダを指定します。

同様に、value属性にプレースホルダを使用する場合は、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) {....}); 
+0

ありがとうございました。同様のエラーがありました。 :-) – kometen

+0

よろしくお願いします。 Amazonsのドキュメントはとても素晴らしいものです。 これはDynamoDBの主なガイドですが、 [Dev Guide Latest Amazon Dynamodb](http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html)@kometen –

2

:statusは、値を提供していない式のプレースホルダです。あなたがここにあなたの他のプレースホルダに値を提供している方法を参照してください:あなたは:statusプレースホルダのために同じことを行う必要があり

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

。エラーメッセージの予約語については何も表示されないので、エラーの原因と思われる理由がわかりません。エラーは、具体的には、:statusプレースホルダの値を指定していないことを示しています。

+0

編集を参照してください。ここで説明されているようにプレースホルダを使っていました。 http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ExpressionPlaceholders.html#ExpressionAttributeNames #statusも:statusも動作していませんが、{[ValidationException: ExpressionAttributeValuesに無効なキーが含まれています。構文エラー。キー: "#status"] with:ステータスはスムーズに実行されますが、データは返されません –

+0

元の質問テキストのようなプレースホルダ構文を使用する必要がありますが、そのプレースホルダの値も指定する必要があります。 'expressionAttr [":status "] =" status "' –

+0

条件メイトと一致しません。値は返されません。私は画像上に示されているようにdbに値を持っています。 aws docは、式属性名には#を使用し、式属性値には#を使用するように指示しています。 –

関連する問題