【问题标题】:Querying a Global Secondary Index in dynamodb Local在 dynamodb Local 中查询全局二级索引
【发布时间】:2015-11-21 19:11:29
【问题描述】:

我正在 DynamoDB 中创建一个表和 GSI,使用这些参数,根据文档:

configId 是表的主键,我使用publisherId 作为 GSI 的主键。 (为简洁起见,我删除了一些不必要的配置参数)

var params = {
    TableName: 'Configs',
    KeySchema: [ 
        {
            AttributeName: 'configId',
            KeyType: 'HASH',
        }
    ],
    AttributeDefinitions: [
        {
            AttributeName: 'configId',
            AttributeType: 'S',
        },
        {
            AttributeName: 'publisherId',
            AttributeType: 'S',
        }
    ],
    GlobalSecondaryIndexes: [ 
        { 
            IndexName: 'publisher_index', 
            KeySchema: [
                {
                    AttributeName: 'publisherId',
                    KeyType: 'HASH',
                }
            ]
        }
    ]
};

我正在使用这个查询这个表:

{ TableName: 'Configs',
  IndexName: 'publisher_index',
  KeyConditionExpression: 'publisherId = :pub_id',
  ExpressionAttributeValues: { ':pub_id': { S: '700' } } }

但我不断收到错误:

“ValidationException:一个或多个参数值无效:条件参数类型与架构类型不匹配”

在文档中,它指定主要的KeyType 可以是HASHRANGE,并且您在AttributeDefinitions 字段中设置AttributeType。我将publisherId 作为String 发送,不确定我在这里缺少什么。

问题是我创建表的方式,还是我查询的方式? 谢谢

【问题讨论】:

  • 我会在“配置”上调用 describeTable,以仔细检查二级索引是否已按预期创建。

标签: node.js amazon-dynamodb aws-sdk


【解决方案1】:

尝试从这里更改ExpressionAttributeValues

{ 
 TableName: 'Configs',
 IndexName: 'publisher_index',
 KeyConditionExpression: 'publisherId = :pub_id',
 ExpressionAttributeValues: { ':pub_id': { S: '700' } } 
}

{ 
 TableName: 'Configs',
 IndexName: 'publisher_index',
 KeyConditionExpression: 'publisherId = :pub_id',
 ExpressionAttributeValues: { ':pub_id': '700'} 
}

{ ':pub_id': { S: '700' } }{ ':pub_id': '700'}

我遇到了同样的问题,为此我花了 2 天时间。官方文档中的误导。

【讨论】:

  • 对不起,我试过了,但它对我不起作用。当我没有提供数据类型的内容时,例如:{':pub_id': { S:'700'}},我收到验证错误。你确定你不是在谈论 ExpressionAttributesNames 而不是 ExpressionAttributesValues?
  • 正确的关键字是 ExpressionAttributeValues 而不是 AttributeS。您确定您的 ValidationException 不是由于这个小错误造成的吗?在我的情况下,我没有使用 ExpressionAttributeNames 参数并且有效。
  • @gior91 酷!这真的帮助了我。谢谢!
  • @RobertOschler 不客气!我很惊讶大约 3 年后这个错误仍然存​​在!!!
  • 这是因为当您使用DocumentClient 时,您不再需要“S”来表示它是一个字符串。 API 在后台获取该数据,但 DocumentClient 在 Node.js 中将其从您那里抽象出来。 docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB/…
【解决方案2】:

事实证明,这取决于您使用的是AWS.DynamoDB 还是AWS.DynamoDB.DocumentClient

检查文档中的差异: AWS.DynamoDB.query 对比 AWS.DynamoDB.DocumentClient.query

在 DocumentClient 文档中明确指出:

文档客户端通过抽象出属性值的概念来简化对 Amazon DynamoDB 中项目的处理。这种抽象对作为输入参数提供的原生 JavaScript 类型进行注释,并将带注释的响应数据转换为原生 JavaScript 类型。

...

提供与 AWS.DynamoDB.query() 相同的参数,其中 AttributeValues 被本机 JavaScript 类型替换。

也许您还提到了DynamoDB API Reference,它实际上没有对所使用的 SDK 做出任何假设,而是在示例中使用纯 HTTP 请求。

因此,使用AWS.DynamoDB.DocumentClient,您只需按照@gior91 的建议为ExpressionAttributeValues 提供一个简单的键值映射。

【讨论】:

    【解决方案3】:

    如上所述,如果您想消除类型转换,则需要使用 DynamoDB 文档客户端。

    var docClient = new AWS.DynamoDB.DocumentClient();
    

    ...那么您可以使用上面列出的对象表示法来调用 API。

    { ':pub_id': '700'}
    

    我自己遇到了这个问题,我在某些地方使用了 DynamoDB(),在其他地方使用了 docClient,暂时无法弄清楚,但这会解决它。

    【讨论】:

      【解决方案4】:

      我发现其他答案很有帮助,但我仍然无法让 ValidationExceptions 消失...最终我意识到我一直在使用 DocumentClient' s .get 而不是 .query ?

      (从技术上讲,这不是问题的答案,但将其发布在此处而不是在评论中,以便让其他任何人更容易看到它,因为它是一个非常无益的错误消息。)

      【讨论】:

      • 嗯,你实际上帮助了我,这就是我错误的根源。谢谢!
      【解决方案5】:

      尝试将您的查询 JSON 替换为:

      {
        TableName: 'Configs',
        IndexName: 'publisher_index',
        KeyConditionExpression: '#publisherId = :pub_id',
        ExpressionAttributeNames: { '#publisherId': 'publisherId' },
        ExpressionAttributeValues: { ':pub_id': { 'S': '700' } }
      }
      

      【讨论】:

        猜你喜欢
        • 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
        相关资源
        最近更新 更多