查询条件缺少具有二级索引字段的关键架构元素
Posted
技术标签:
【中文标题】查询条件缺少具有二级索引字段的关键架构元素【英文标题】:Query condition missed key schema element with a secondary index field 【发布时间】:2021-01-24 15:18:29 【问题描述】:第一次使用 dynamodb 和无服务器框架。我正在尝试创建一个简单的待办事项应用程序。以 todoId 作为主键, userId 作为二级索引。这是我在 serverless.yaml 中对表的定义,但是当我尝试获取用户的待办事项列表时,出现上述错误。
resources:
Resources:
GroupsDynamoDBTable:
Type: AWS::DynamoDB::Table
Properties:
AttributeDefinitions:
- AttributeName: todoId
AttributeType: S
- AttributeName: userId
AttributeType: S
KeySchema:
- AttributeName: todoId
KeyType: HASH
BillingMode: PAY_PER_REQUEST
TableName: $self:provider.environment.TODOLIST_TABLE
GlobalSecondaryIndexes:
- IndexName: $self:provider.environment.USER_ID_INDEX
KeySchema:
- AttributeName: userId
KeyType: HASH
Projection:
ProjectionType: ALL
查询:
const result = await docClient
.query(
TableName: toDoListTable,
KeyConditionExpression: 'userId = :userId',
ExpressionAttributeValues:
':userId': 5
,
ScanIndexForward: false
)
.promise()
【问题讨论】:
【参考方案1】:由于您使用全局二级索引进行查询,因此您必须指定要使用的索引的名称以及要在查询结果中返回的属性。
结果应该是这样的:
const result = await docClient
.query(
TableName: toDoListTable,
IndexName: "UserIdIndex", // the name specified here: self:provider.environment.USER_ID_INDEX
KeyConditionExpression: "userId = :userId",
ExpressionAttributeValues:
":userId": 5
,
ProjectionExpression: "todoId, userId",
ScanIndexForward: false
)
.promise()
【讨论】:
非常感谢。只是好奇我可以通过 userid 和 todoid 删除项目...比如 where todoid = 1 和 userid=1 之类的东西? 是的,它应该像这样工作。这是一个示例:docs.aws.amazon.com/amazondynamodb/latest/developerguide/… 不想打扰你,但我确实喜欢 Key: todoId:todoId, userId: 2 但它不会引发架构错误的一部分以上是关于查询条件缺少具有二级索引字段的关键架构元素的主要内容,如果未能解决你的问题,请参考以下文章