DynamoDB GetItem操作键条件数量无效问题求助
问题原因与解决方案
这个错误的核心原因很明确:DynamoDB的GetItem操作要求必须提供完整的主键。如果你的表使用的是复合主键(HASH键 + RANGE键),那么必须同时指定这两个键的值,否则就会抛出The number of conditions on the keys is invalid错误。
我们来拆解你的两个表结构,就能明白为什么会出现差异:
1. 关于SessionsDynamoDbTable的疑问
你提到在这个表中可以仅通过HASH键执行GetItem,但从你提供的表定义来看,它的主键是userId(HASH) + id(RANGE)的复合结构——按道理来说,GetItem必须同时传入这两个键的值才能成功。
我猜测这里可能存在一个误解:你实际使用的应该是Query操作(而非GetItem),因为Query允许你仅指定HASH键,返回该HASH值下所有匹配的项。比如正确的Query代码应该是这样:
const params = { TableName: process.env.DYNAMODB_TABLE, KeyConditionExpression: 'userId = :userId', ExpressionAttributeValues: { ':userId': yourUserId } }; const { Items } = await dynamoDb.query(params);
如果确实是用GetItem成功了,那大概率是表结构描述有误,或者你的代码中实际传入了完整的主键(userId + id)但你没留意到。
2. 解决SessionsTable的报错问题
这个表的主键是id(HASH) + expiresAt(RANGE)的复合结构,所以执行GetItem时必须同时提供这两个键的值,比如:
const params = { TableName: process.env.DYNAMODB_TABLE, Key: { id: sessionId, expiresAt: expiresTimestamp } // expiresTimestamp是数字类型的时间戳 }; const { Item } = await dynamoDb.get(params);
如果你想通过id查询所有相关的会话记录(而不是单一记录),那应该改用Query操作,而不是GetItem:
const params = { TableName: process.env.DYNAMODB_TABLE, KeyConditionExpression: 'id = :id', ExpressionAttributeValues: { ':id': sessionId } }; const { Items } = await dynamoDb.query(params);
关键总结
GetItem:用于获取唯一的单条记录,必须提供完整的主键(无论是单一HASH键,还是复合HASH+RANGE键)。Query:用于获取某个HASH键下的所有关联记录,仅需提供HASH键的值即可(针对复合主键的场景)。
内容的提问来源于stack exchange,提问作者Danielo515
相关产品推荐
相关产品推荐

