DynamoDB使用QueryRequest按布尔值IsAdmin查询无结果求助
DynamoDB查询IsAdmin=true无结果的原因及解决方案
核心问题
你用Query操作时,把非主键列IsAdmin放到了KeyConditionExpression里——这是错误的,因为DynamoDB的Query操作**只能针对表的主键(分区键,或者分区键+排序键)**设置KeyConditionExpression,普通属性不能这么用。之前查Username能成功,是因为Username是你的表的分区键,符合Query的要求。
两种解决办法
办法一:用Scan操作过滤(适合数据量小的场景)
Scan会遍历表中所有项,再用FilterExpression过滤出符合条件的结果,代码示例:
var request = new ScanRequest { TableName = aTableName, FilterExpression = "IsAdmin = :v_IsAdmin", ExpressionAttributeValues = new Dictionary<string, AttributeValue> { { ":v_IsAdmin", new AttributeValue { BOOL = true } } } }; var response = await _client.ScanAsync(request);
注意:Scan会读取全表数据,数据量大时性能差、成本高,不建议在生产环境的大数据量表中频繁使用。
办法二:给IsAdmin创建全局二级索引(GSI)(推荐生产环境使用)
给IsAdmin创建GSI后,就可以用Query操作高效查询该索引,步骤如下:
- 给表添加GSI,索引的分区键设为
IsAdmin(布尔类型可以作为GSI的分区键)。 - 使用Query操作查询这个GSI,代码示例:
var request = new QueryRequest { TableName = aTableName, IndexName = "IsAdmin-index", // 替换成你创建的GSI名称 KeyConditionExpression = "IsAdmin = :v_IsAdmin", ExpressionAttributeValues = new Dictionary<string, AttributeValue> { { ":v_IsAdmin", new AttributeValue { BOOL = true } } } }; var response = await _client.QueryAsync(request);
GSI会同步表中IsAdmin的数据,Query时直接查询索引,性能和成本都更优,适合数据量大的场景。
内容的提问来源于stack exchange,提问作者Maxqueue
相关产品推荐
相关产品推荐

