【问题标题】:DynamoDB: Query on GSI (Global secondary index) does not return dataDynamoDB:对 GSI(全局二级索引)的查询不返回数据
【发布时间】:2017-11-16 13:33:33
【问题描述】:

我正在使用无服务器框架来设置下表:

provider:
  name: aws
  runtime: nodejs6.10
  stage: dev
  region: ap-southeast-1
  environment:
    DYNAMODB_TABLE: "Itinerary-${self:provider.stage}"
    DYNAMODB_COUNTRY_INDEX: country_index
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
      Resource: "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}"
    - Effect: Allow
      Action:
        - dynamodb:Query
        - dynamodb:Scan
        - dynamodb:GetItem
        - dynamodb:PutItem
        - dynamodb:UpdateItem
        - dynamodb:DeleteItem
      Resource: "arn:aws:dynamodb:${opt:region, self:provider.region}:*:table/${self:provider.environment.DYNAMODB_TABLE}/index/${self:provider.environment.DYNAMODB_COUNTRY_INDEX}"
resources:
  Resources:
    ItineraryTable:
      Type: 'AWS::DynamoDB::Table'
      DeletionPolicy: Retain
      Properties:
        AttributeDefinitions:
          -
            AttributeName: ID
            AttributeType: S
          -
            AttributeName: Country
            AttributeType: S
        KeySchema:
          -
            AttributeName: ID
            KeyType: HASH
        GlobalSecondaryIndexes:
          -
            IndexName: ${self:provider.environment.DYNAMODB_COUNTRY_INDEX}
            KeySchema:
              -
                AttributeName: Country
                KeyType: HASH
            Projection:
              ProjectionType: ALL
            ProvisionedThroughput:
              ReadCapacityUnits: 1
              WriteCapacityUnits: 1
        ProvisionedThroughput:
          ReadCapacityUnits: 1
          WriteCapacityUnits: 1
        TableName: ${self:provider.environment.DYNAMODB_TABLE}

现在,我可以通过 ID 执行“获取”以从数据库中检索项目。但是,如果我尝试对 GSI 进行“查询”,它不会返回任何内容。没有失败,但我永远无法取回数据。

我的查询如下所示:

const dynamoDb = new AWS.DynamoDB.DocumentClient();

var params = {
    TableName: process.env.DYNAMODB_TABLE, // maps back to the serverless config variable above
    IndexName: process.env.DYNAMODB_COUNTRY_INDEX, // maps back to the serverless config variable above
    KeyConditionExpression: "Country=:con",
    ExpressionAttributeValues: { ":con" : "Portugal" }
};

dynamoDb.query(params, (error, result) => {
    // handle potential errors
    if (error) {
        console.error(error);
        callback(null, {
            statusCode: error.statusCode || 501,
            headers: { 'Content-Type': 'text/plain' },
            body: 'Couldn\'t fetch the Itineraries'+error,
        });
        return;
    }
}

var json_result = JSON.stringify(result.Item);

我应该在这里补充一点,如果我也进行无过滤“扫描”,我将无法获取数据。如果我尝试在 AWS Dynamo 门户网站上按索引(或其他方式)搜索项目,我会得到结果。

我无法弄清楚这里出了什么问题。任何人都可以阐明的任何光都将不胜感激。

【问题讨论】:

  • 您确定该国家/地区存储的大小写与您在 express 属性值中提到的相同(即大写 P 的驼峰式大小写)吗?
  • 您可以使用 AWS 控制台执行查询并获得结果吗?
  • @notionquest:这个案子看起来不错。有问题的项目在数据库中存储为“国家”:“葡萄牙”。
  • @StevenS.: 是的,如果我去控制台,选择 Query against Index,然后只搜索 Country,就可以了。
  • 您能否运行“aws dynamodb describe-table --table-name Itinerary-Dev”并检查 IndexStatus 和回填状态?请使用描述表输出更新 OP。

标签: amazon-dynamodb aws-lambda serverless-framework


【解决方案1】:

好的,所以我找到了问题所在。我发布的问题中缺少关键声明(因为我认为它不相关),但结果证明是问题所在。

我只是使用以下方法对查询结果进行字符串化:

var json_result = JSON.stringify(result.Item);

以上适用于“get”,但对于查询,它需要是 result.Items:

var json_result = JSON.stringify(result.Items);

我很傻。感谢您的帮助!

附:我已将声明添加到原始问题中以明确

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    相关资源
    最近更新 更多