如何在DynamoDB列表中筛选指定friendId的Messages项?
解决DynamoDB列表中筛选特定条目的问题
原请求的问题
你当前的FilterExpression写法存在错误:
Messages是列表(L类型),无法直接通过.friendId访问列表内元素的属性;contains函数仅用于检查字符串是否包含子串、集合是否包含元素,不能遍历列表中的Map对象并匹配属性值,这就是请求无结果的原因。
可行解决方案
方案1:修正FilterExpression筛选条目,客户端过滤列表
如果只需先筛选出包含目标friendId的用户条目,再在客户端提取匹配的Messages元素,可将FilterExpression修改为:
FilterExpression = "exists(Messages[?friendId = :friendId])"
该表达式会检查Messages列表中是否存在friendId等于:friendId的元素,返回符合条件的完整用户条目(包含所有Messages),之后你再在客户端循环筛选目标元素即可。
对应的完整QueryRequest:
var queryRequest = new QueryRequest { TableName = tableName, KeyConditionExpression = "UserId = :userId", ExpressionAttributeValues = new Dictionary<string, AttributeValue> { { ":userId", new AttributeValue { N = userId } }, { ":friendId", new AttributeValue { N = "1" } } }, FilterExpression = "exists(Messages[?friendId = :friendId])", ProjectionExpression = "Messages" };
方案2:用Projection Expression直接返回匹配的列表元素
若想让DynamoDB直接返回仅包含friendId=1的Messages元素,可使用条件投影语法,在ProjectionExpression中过滤列表:
var queryRequest = new QueryRequest { TableName = tableName, KeyConditionExpression = "UserId = :userId", ExpressionAttributeValues = new Dictionary<string, AttributeValue> { { ":userId", new AttributeValue { N = userId } }, { ":friendId", new AttributeValue { N = "1" } } }, ProjectionExpression = "Messages[?friendId = :friendId]" };
此请求会直接返回符合条件的Messages子列表,完全匹配你期望的输出结构。
注意:这种条件投影语法需要DynamoDB版本支持,请确保使用的SDK与服务端版本兼容。
内容的提问来源于stack exchange,提问作者Wajeeh Hasan
相关产品推荐
相关产品推荐

