2016-04-18 44 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表示使用#表達屬性名稱和:表達式屬性值。 –