2015-11-21 42 views
10

我創造了發電機表和GSI,使用這些參數,按文件:查詢全球次級指數dynamodb本地

的configId是表的主鍵,我現在用的是兩個publisherId作爲。對於GSI的主鍵(I已移除爲了簡潔一些不必要的配置參數)

var params = { 
    TableName: 'Configs', 
    KeySchema: [ 
     { 
      AttributeName: 'configId', 
      KeyType: 'HASH', 
     } 
    ], 
    AttributeDefinitions: [ 
     { 
      AttributeName: 'configId', 
      AttributeType: 'S', 
     }, 
     { 
      AttributeName: 'publisherId', 
      AttributeType: 'S', 
     } 
    ], 
    GlobalSecondaryIndexes: [ 
     { 
      IndexName: 'publisher_index', 
      KeySchema: [ 
       { 
        AttributeName: 'publisherId', 
        KeyType: 'HASH', 
       } 
      ] 
     } 
    ] 
}; 

我使用這個查詢該表:

{ TableName: 'Configs', 
    IndexName: 'publisher_index', 
    KeyConditionExpression: 'publisherId = :pub_id', 
    ExpressionAttributeValues: { ':pub_id': { S: '700' } } } 

,但我繼續收到錯誤: 「ValidationException:一個或多個參數值無效:條件參數類型與模式類型不匹配」

在文檔中指定主KeyType可以是HASH或RANGE,並且您設置了attributeDefinitions字段中的attributeType。我發送publisherId作爲字符串,不知道我在這裏失蹤。

問題在於我創建表的方式或我查詢的方式? 感謝

+0

我會在'配置'上進行一次describeTable調用,檢查是否按預期創建了二級索引。 –

回答

33

嘗試從{ ':pub_id': { S: '700' } }改變這種

{ 
TableName: 'Configs', 
IndexName: 'publisher_index', 
KeyConditionExpression: 'publisherId = :pub_id', 
ExpressionAttributeValues: { ':pub_id': { S: '700' } } 
} 

在此

{ 
TableName: 'Configs', 
IndexName: 'publisher_index', 
KeyConditionExpression: 'publisherId = :pub_id', 
ExpressionAttributeValues: { ':pub_id': '700'} 
} 

{ ':pub_id': '700'}

我有同樣的問題,我花了2天的時間。官方文件誤導。

+0

對不起,我試過但它不適合我。當我不提供數據類型的東西時,如:{':pub_id':{S:'700'}},我得到一個驗證錯誤。你確定你不是在討論ExpressionAttributesNames而不是ExpressionAttributesValues? –

+0

正確的關鍵字是「ExpressionAttributeValues」而不是「屬性」。你確定你的ValidationException不是由於這個小錯誤嗎?在我的情況下,我不使用'ExpressionAttributeNames'參數,並且工作。 – gior91

+0

@ gior91酷!這真的幫助了我。謝謝! – ckuijjer

0

嘗試用這種替代查詢JSON:

{ 
    TableName: 'Configs', 
    IndexName: 'publisher_index', 
    KeyConditionExpression: '#publisherId = :pub_id', 
    ExpressionAttributeNames: { '#publisherId': 'publisherId' }, 
    ExpressionAttributeValues: { ':pub_id': { 'S': '700' } } 
} 
2

原來這取決於你是否使用AWS.DynamoDBAWS.DynamoDB.DocumentClient

檢查文檔中的區別: AWS.DynamoDB.queryAWS.DynamoDB.DocumentClient.query

在DocumentClient商務部明確指出:

The document client simplifies working with items in Amazon DynamoDB by abstracting away the notion of attribute values. This abstraction annotates native JavaScript types supplied as input parameters, as well as converts annotated response data to native JavaScript types.

...

Supply the same parameters as AWS.DynamoDB.query() with AttributeValues substituted by native JavaScript types.

也許你哪裏還指DynamoDB API Reference這其實不做任何假設關於使用的SDK,但在示例中使用純HTTP請求。

因此,使用AWS.DynamoDB.DocumentClient您可以按照@ gior91的建議爲ExpressionAttributeValues提供一個簡單的鍵值映射。

3

如上所述,如果您想要刪除類型轉換,則需要使用DynamoDB Document Client。

var docClient = new AWS.DynamoDB.DocumentClient(); 

...然後您可以使用上面列出的對象符號來調用API。

{ ':pub_id': '700'} 

就遇到了這個問題我自己,我是用DynamoDB()在其他一些地方和docClient,無法弄清楚一段時間,但會解決這個問題。