我一直在试图找到一个解释这种情况,但我没有找到任何。我有两个DynamoDb表,都有两个键索引,一个是HASH键,另一个是RANGE键。
在两个键都是字符串的表中,我可以只使用HASH键查询数据库,如下所示(使用node sdk):
const params = {
TableName: process.env.DYNAMODB_TABLE,
Key: { id: sessionId },
};
const { Item } = await dynamoDb.get(params);
但是,在另一个表上执行相同的操作会抛出上述关于The number of conditions on the keys is invalid
的错误
下面是两个表模式:
这个表定义允许我使用上面提到的查询。
SessionsDynamoDbTable:
Type: 'AWS::DynamoDB::Table'
DeletionPolicy: Retain
Properties:
AttributeDefinitions:
-
AttributeName: userId
AttributeType: S
-
AttributeName: id
AttributeType: S
-
AttributeName: startDate
AttributeType: S
KeySchema:
-
AttributeName: userId
KeyType: HASH
-
AttributeName: id
KeyType: RANGE
LocalSecondaryIndexes:
- IndexName: byDate
KeySchema:
- AttributeName: userId
KeyType: HASH
- AttributeName: startDate
KeyType: RANGE
Projection:
NonKeyAttributes:
- endDate
- name
ProjectionType: INCLUDE
BillingMode: PAY_PER_REQUEST
TableName: ${self:provider.environment.DYNAMODB_TABLE}
这不允许我进行像上面提到的那样的查询
SessionsTable:
Type: 'AWS::DynamoDB::Table'
TimeToLiveDescription:
AttributeName: expiresAt
Enabled: true
Properties:
AttributeDefinitions:
-
AttributeName: id
AttributeType: S
-
AttributeName: expiresAt
AttributeType: N
KeySchema:
-
AttributeName: id
KeyType: HASH
-
AttributeName: expiresAt
KeyType: RANGE
BillingMode: PAY_PER_REQUEST
TableName: ${self:provider.environment.DYNAMODB_TABLE}
我包括了整个表定义,因为我不知道辅助索引是否会对这个问题产生影响。
1条答案
按热度按时间bf1o4zei1#
必须提供分区键属性的名称和该属性的单个值。查询返回具有该分区键值的所有项。或者,您可以提供排序键属性并使用比较运算符来细化搜索结果。more
get(params,callback)⇒ AWS.Request
通过委托给AWS.DynamoDB.getItem(),返回具有给定主键的项的一组属性。
在SessionsTable中,
id
是HASH键,在SessionsDynamoDbTable中,id
是RANGE键。对于SessionsDynamoDbTable,除了RANGE键外,还应提供HASH键。