Javascript DynamoDB中的扫描函数,保留关键字为FilterExpression NodeJS

Javascript DynamoDB中的扫描函数,保留关键字为FilterExpression NodeJS,javascript,node.js,amazon-web-services,amazon-dynamodb,Javascript,Node.js,Amazon Web Services,Amazon Dynamodb,我的扫描功能: var tableName = 'faasos_orders', filterExp = 'status = :delivered OR status = :void OR status = :bad', projectionValues = '', expressionAttr = {}; expressionAttr[":delivered"] = "delivered"; expressionAttr[":bad"] = "b

我的扫描功能:

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 }
现在我明白了,我正试图在 e filterExpression,这是非法的。 但是,如果我通过aws gui运行相同的函数,它会漂亮地返回数据(查看图片了解详细信息):


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

:status
是表达式中未提供值的占位符。在此处查看如何为其他占位符提供值:

expressionAttr[":delivered"] = "delivered";
expressionAttr[":bad"] = "bad";
expressionAttr[":void"] = "void"
您需要对
:status
占位符执行相同的操作。我在错误消息中没有看到任何关于保留字的信息,因此我不确定您为什么认为这是错误的原因。该错误特别指出,您没有为
:status
占位符提供值。

已解决:

aws sdk采用两个参数:

表达式属性名

表达式属性值

两者都提供替换属性列表中使用的占位符的功能。 这里的属性有点模棱两可,这让我感到困惑。 aws上的向导在使用术语属性时表示键和值

因此,如果要使用保留关键字作为键属性,请使用带有#(pound)的表达式属性名称参数来表示占位符

类似地,如果要为值属性使用占位符,请使用带有:(冒号)的表达式属性值参数来表示占位符

最后,我的代码(工作)如下所示:

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和:status似乎都不起作用,{[ValidationException:ExpressionAttributeValues包含无效键:语法错误;键:“#status”]对于:status,表达式虽然运行平稳,但不返回任何数据。您必须使用与原始问题文本类似的占位符语法,但还需要为该占位符提供值:
expressionAttr[“:status”]=“status”
与条件匹配不匹配。不返回任何值。尽管我在db中有值,如图所示。aws文档要求使用#表示表达式属性名称,使用:表示表达式属性值。然后使用
#
看看它是否有效?事实上,您必须为您在查询中输入的任何占位符提供一个值,而我这就是错误消息所抱怨的。谢谢你的努力。有一个类似的错误:-)是的。亚马逊的文档非常棒,你知道。尽管他们发现这是DynamoDB的主要指南:@Kometenis在C#中也可以使用(语法略有改变)大概还有aws SDK支持的所有其他语言