2016-04-18 106 views
3

我的扫描功能:扫描功能在DynamoDB与保留关键字作为FilterExpression的NodeJS

{ [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 } 

现在我得到我想要使用一个保留关键字的一点:

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) { ...........} 

上运行出错e过滤表达式是非法的。 但是,如果我跑通过AWS相同功能的图形用户界面,它返回的数据精美(查看图像的详细信息): Scan function on status through gui

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

回答

13

解决:

有由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) {....}); 
+0

谢谢你的努力。有一个类似的错误。 :-) – kometen

+0

耶。 Amazons文档非常棒,你知道。 虽然发现这是他们的主要指南DynamoDB: [开发指南最新的亚马逊dynamodb](http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html)@kometen –

2

:status是表达式中的一个占位符,表示您没有提供值。见你是如何为你的其他占位符这里提供的值:

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

您需要为:status占位这样做。我在错误信息中没有看到任何关于保留字的内容,所以我不确定为什么你认为这是错误的原因。该错误非常明确地指出,您没有为:status占位符提供值。

+0

请参阅编辑。一直在占用这里解释的 http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ExpressionPlaceholders.html#ExpressionAttributeNames 尽管#status和:status似乎都不起作用,{[ValidationException: ExpressionAttributeValues包含无效键:语法错误;键:“#status”] And with:status表达式虽然运行平稳,但不返回任何数据 –

+0

必须使用原始问题文本中的占位符语法,但此时还需要提供该占位符的值: 'expressionAttr [“:status”] =“status”' –

+0

这不符合条件队友。没有值返回。尽管我在图像上显示了数据库中的值。 aws doc表示使用#表达属性名称和:表达式属性值。 –