查询条件缺少具有二级索引字段的关键架构元素

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 但它不会引发架构错误的一部分

以上是关于查询条件缺少具有二级索引字段的关键架构元素的主要内容,如果未能解决你的问题,请参考以下文章

HBase二级索引的设计

HBase二级索引的设计

使用 DynamoMapper 和类 Annotation 创建具有全局二级索引的表

二级关键词搜索的索引结构

MySQL二级索引的查询过程

MySQL二级索引的查询过程