使用保留关键字FilterExpression NodeJS在DynamoDB中扫描函数

Sal*_*med 13 javascript amazon-web-services node.js amazon-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) {  ...........} 
Run Code Online (Sandbox Code Playgroud)

运行时出错:

    { [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 }
Run Code Online (Sandbox Code Playgroud)

现在我明白我试图在filterExpression中使用保留关键字,这是非法的.但是,如果我通过aws gui运行相同的功能,它会很好地返回数据(查看图像以获取详细信息): 通过gui扫描状态

所以问题是如何通过节点添加过滤器表达式而不必更改密钥名称???

Sal*_*med 38

解决了 :

aws-sdk采用了两个参数:

表达式属性名称

表达式属性值

两者都提供替换属性列表中使用的占位符的功能.这里的属性有点含糊不清,让我感到困惑.aws上的向导在使用term属性时表示键和值.

因此,在一个情况下,你要使用保留关键字作为一个关键属性使用表达式属性以#(磅)名称参数表示的占位符.

类似地,如果要为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) {....});
Run Code Online (Sandbox Code Playgroud)