当前位置: 首页 > 知识库问答 >
问题:

在dynamodb Local中查询全局二级索引

蒙勇
2023-03-14

我正在DynamoDB中创建一个表和GSI,使用以下参数,如文档所示:

confiId是表的主键,我使用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' } } }

但我一直在犯错误:

"一个或多个参数值无效:条件参数类型与模式类型不匹配"

在文档中,它指定主键类型可以是散列范围,并且您可以在属性定义字段中设置属性类型。我正在以String的形式发送publisherId,不确定这里缺少了什么。

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

共有3个答案

潘英豪
2023-03-14

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

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

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

{ ':pub_id': '700'}

我自己也遇到了这个问题,我在一些地方使用DynamoDB(),在另一些地方使用docClient,一时想不出来,但这会解决它。

贲高寒
2023-03-14

这取决于你是否使用AWS。DynamoDB或AWS。DynamoDB。DocumentClient。

检查留档中的差异:AWS. DynamoDB. Query vs. AWS. DynamoDB. DocumentClient.query

在DocumentClient中,文件明确说明:

文档客户端通过抽象出属性值的概念,简化了在Amazon DynamoDB中处理项目的过程。该抽象对作为输入参数提供的本机JavaScript类型进行注释,并将注释后的响应数据转换为本机JavaScript类型。

...

提供与AWS相同的参数。DynamoDB。query(),attributeValue由本机JavaScript类型替换。

也许你还参考了DynamoDB API参考,它实际上没有对使用的SDK进行假设,但在示例中使用了普通的HTTP请求。

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

解博明
2023-03-14

尝试从这里更改ExpressionAtiniteVales

{ 
 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天的时间。官方留档误导。

 类似资料:
  • 我有以下带有三个全局二级索引(GSI)的DyamoDB表 Id(主键)、user_id(GSI)、event_type(GSI)、product_id(GSI)、rate、create_date 我有以下三种查询模式: null null

  • 本文(https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-indexes-gsi-sharding.html)讨论一种通过引入一个随机整数作为分区键,在多个分区之间对全局二级索引值进行分片的技术。 这对我来说是有意义的,但本文没有清楚地解释如何查询该索引。假设我使用一个1-10的随机整数作为分区键,一个数字作为排序

  • 我仍然对本地二级索引的使用感到困惑。当需要LSI与GSI时,请给我具体的用例。 例如,“GenreAlbumTitle”索引应该是GSI还是LSI?https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.Prim

  • 我有一个DynamoDB表,分区键为userID,没有排序键。该表在每个项目中还具有时间戳属性。我想检索在指定范围内具有时间戳的所有项目(无论用户ID如何,即跨所有分区)。在阅读文档并搜索堆栈溢出(此处)后,我发现需要为我的表创建一个GSI。因此,我使用以下键创建了一个GSI: 分区键: 排序键: 我正在使用Java SDK使用以下代码查询索引: 执行此代码时出现以下错误: 据我所知,我应该能够仅

  • 我的主键是一个名为“ID”的字段 我在表中的字段“group_number”上添加了一个辅助索引 我通过二级索引进行查询,如下所示: 然而;我得到错误“ValidationException:query condition missed key schema Element:ID” DynamoDB只允许查询主键吗?我的印象是您使用“getitem”作为主键,因为如果您使用一个主键,只有一个记录可

  • 我是AWS DynamoDB和nosql的新手,我对表创建有问题。 我试图创建一个名为的表,具有以下属性: 用户ID(HASH) OSType(范围) MSISDN IMSI 设备ID 我不仅需要通过查询表,还需要通过以下字段查询表: MSISDN 我的逻辑如下: 通过字段查询表 在阅读了有关LSI/GSI的手册后,我很难理解如何创建表和定义这些索引。 这是我尝试使用PHP AWS SDK创建表的