使用保留关键字作为 FilterExpression NodeJS 扫描 DynamoDB 中的函数

Posted

技术标签:

【中文标题】使用保留关键字作为 FilterExpression NodeJS 扫描 DynamoDB 中的函数【英文标题】:Scan Function in DynamoDB with reserved keyword as FilterExpression NodeJS 【发布时间】:2016-08-10 11:37:07 【问题描述】:

我的扫描功能:

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

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

【问题讨论】:

【参考方案1】:

已解决:

aws-sdk 有两个参数:

表达式属性名称

表达式属性值

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

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

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

所以最后我的代码(工作)看起来像这样:

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

【讨论】:

感谢您的努力。有类似的错误。 :-) 是的。你知道,亚马逊的文档真是太棒了。虽然发现这是他们的 DynamoDB 主要指南:Dev Guide Latest Amazon dynamodb@kometen 这也适用于 C#(稍有语法更改)以及 aws sdks 支持的所有其他语言。 这里是@ElliotBlackburn提到的c#语法docs.aws.amazon.com/sdk-for-net/v2/developer-guide/…【参考方案2】:

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

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

您需要对 :status 占位符执行相同的操作。我在错误消息中没有看到任何关于保留字的信息,所以我不确定您为什么认为这是导致错误的原因。该错误非常明确地表明您没有为 :status 占位符提供值。

【讨论】:

请查看编辑。一直在玩弄占位符,正如这里所解释的 docs.aws.amazon.com/amazondynamodb/latest/developerguide/… 虽然 #status 和 :status 似乎都不起作用,但 [ValidationException: ExpressionAttributeValues contains invalid key: Syntax error; key: "#status"] 使用 :status 表达式虽然运行平稳但不返回任何数据 您必须使用原始问题文本中的占位符语法,但您还需要提供该占位符的值:expressionAttr[":status"] = "status" 这与条件不匹配。不返回任何值。虽然我在数据库中有值,如图所示。 aws 文档说将 # 用于表达式属性名称,将 : 用于表达式属性值。 然后使用# 看看是否有效?事实上,您必须为您在查询中放置的任何占位符提供一个值,这就是错误消息所抱怨的内容。 旧帖子,但似乎需要澄清一下。错误消息特别提到了关于保留关键字的错误! “状态”是每个文档的保留关键字 (docs.aws.amazon.com/amazondynamodb/latest/developerguide/…)。这就是为什么您需要使用 ExpressionAttributeNames 才能仍然能够在过滤器中使用属性“status”,如下所示。

以上是关于使用保留关键字作为 FilterExpression NodeJS 扫描 DynamoDB 中的函数的主要内容,如果未能解决你的问题,请参考以下文章

使用'class'(或其他保留关键字)作为匿名类型的属性

Java中关键字和保留字

在 SQL Server 存储过程中查找表名的列名作为保留关键字

在 MS SQL Server 中创建作为保留字/关键字的表名 [关闭]

Java中的关键字/保留字

避免使用PHP保留字作为常量类名和方法名,以及命名空间的命名