二级索引的“提供的关键元素与架构不匹配”

Nic*_*ion 4 amazon-web-services node.js amazon-dynamodb

我有一个描述的 DynamoDB 表(用户应该可以通过唯一的 user_id 或用户名 + system_id 的组合来选择):

"TableName": "auth-users",
"KeySchema": [ {
        "KeyType": "HASH", 
        "AttributeName": "user_id"
    }
], 
"AttributeDefinitions": [ {
    {
        "AttributeName": "user_id", 
        "AttributeType": "S"
    },
        "AttributeName": "system_id", 
        "AttributeType": "S"
    },  {
        "AttributeName": "username", 
        "AttributeType": "S"
    }
], 
"GlobalSecondaryIndexes": [
    {
        "IndexName": "username-system_id-index", 
        "Projection": {
            "ProjectionType": "ALL"
        }, 
        "IndexStatus": "ACTIVE", 
        "KeySchema": [ {
               "KeyType": "HASH", 
               "AttributeName": "username"
            }, {
               "KeyType": "RANGE", 
               "AttributeName": "system_id"
            }
        ]
    }
],
... 
Run Code Online (Sandbox Code Playgroud)

当我使用主键运行以下代码时,我得到了一个记录列表,正如预期的那样:

var AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB({region: 'ap-southeast-2');
var userTable = 'auth-users';
var key = { user_id: '123412341234' };

dynamodb.getItem({
   TableName: tableName,
   Key: key
}, function(err,data) { 
   console.error('err:',err); 
   console.info('data:', data); 
});
Run Code Online (Sandbox Code Playgroud)

...但如果我尝试使用全局二级索引,将键替换为:

var key = {
    username:  {S: 'testuser'}, 
    system_id: {S: 'test-system'}
};
Run Code Online (Sandbox Code Playgroud)

然后我得到一个ValidationException: The provided key element does not match the schema

Nic*_*ion 6

...没关系 - RTFM:

GetItem 操作返回具有给定主键的项目的一组属性

要使用二级索引,您需要进行查询并提供索引名称。