DynamoDB QueryCommand无返回结果:PutItem成功但查询为空问题排查
已通过PutItemCommand成功向DynamoDB写入条目,且能通过AWS控制台扫描确认条目存在,但使用QueryCommand查询时返回空数组。表主键由分区键_type和排序键uid(字符串类型哈希值)组成,查询特定分区键下所有条目的代码如下:
import { marshall, unmarshall } from "@aws-sdk/util-dynamodb"; import { DynamoDBClient, QueryCommand } from "@aws-sdk/client-dynamodb"; const client = new DynamoDBClient({...credentials}); const res = await client.send(new QueryCommand({ TableName: SOME_NAME, ScanIndexForward: false, KeyConditionExpression: "#_type = :type AND uid > :uid", ExpressionAttributeValues: marshall({ ":type": "apple", ":uid": "0" }), ExpressionAttributeNames: { "#_type": "_type" }, })); if(res) { return res.items.map(item => unmarshall (item)); }else{ throw Error("Failed to fetch"); }
目标查询条目主键为_type='apple'、uid='dh46dhdj3jdhd738',请问为何查询无结果?
字符串排序逻辑不符预期
DynamoDB对字符串类型排序键的比较基于UTF-8二进制值逐字符对比。若目标uid开头包含空格、控制字符等不可见内容,会导致其实际排序位置小于"0",无法满足uid > "0"的条件。可在AWS控制台查看uid的原始值,确认无隐藏字符。Marshall参数格式异常
检查marshall处理后的ExpressionAttributeValues是否生成了正确的DynamoDB类型结构。可临时打印该参数结果,确保:type对应{ S: "apple" }、:uid对应{ S: "0" },避免因类型不匹配导致条件失效。主键值大小写/拼写不一致
DynamoDB对字符串类型主键值大小写敏感,需确认写入的_type是小写"apple"而非变体(如"Apple"),同时检查uid的拼写、大小写、特殊字符与目标条目完全一致。客户端区域配置不匹配
验证DynamoDBClient的region配置是否与写入条目时的区域一致。若查询的是不同区域的表,将无法找到目标条目。查询条件逻辑冗余
若目标是获取该分区键下的所有条目,可简化查询条件为仅指定分区键:KeyConditionExpression: "#_type = :type",去掉排序键的过滤条件,避免因排序键条件错误导致无结果。
内容的提问来源于stack exchange,提问作者Waleed93

