[英]Dynamo DB query not returning expected results when using nested collections
我有一个具有以下结构的 AWS DynamoDB 表:
我正在尝试取回至少包含一个 ID 为 3401 的 RequestItem 的所有项目。这是我迄今为止尝试过的(c# 代码):
IAmazonDynamoDB client = new AmazonDynamoDBClient(
new BasicAWSCredentials(configuration["AccessKey"], configuration["SecretKey"]),
RegionEndpoint.USEast1);
var request = new ScanRequest
{
TableName = "dynamo-table-name",
ExpressionAttributeNames = new Dictionary<string, string>
{
{"#requestItems", "RequestItems"},
{"#requestId", "Id"}
},
ExpressionAttributeValues = new Dictionary<string, AttributeValue>
{
{":val", new AttributeValue {N = "3401"}}
},
FilterExpression = "contains(#requestItems.#requestId, :val)"
};
var response = await client.ScanAsync(request);
我对 FilterExpression 做了一些变化(使用简单的“=”而不是“包含”)但是......我仍然没有得到结果。 查询通过而没有错误,但结果是一个空列表。
但是,相同的代码适用于不是集合的属性(例如 Contact.EmailAddress)
我错过了什么?
[编辑]
我尝试了另一种建议的解决方案:
var request = new ScanRequest
{
TableName = "dynamo-table-name",
ExpressionAttributeNames = new Dictionary<string, string>
{
{"#requestItems", "RequestItems"}
},
ExpressionAttributeValues = new Dictionary<string, AttributeValue>
{
{
":val",
new AttributeValue
{
L = new List<AttributeValue>
{
{
new AttributeValue
{
M = new Dictionary<string, AttributeValue>
{{"Id", new AttributeValue {N = "3401"}}}
}
}
}
}
}
},
FilterExpression = "contains(#requestItems, :val)"
};
var response = await client.ScanAsync(request);
但我仍然没有收到结果。
您无法真正使用 DynamoDB 执行您想要的查询。 如果您知道RequestItems
中可能contains
的最大项目数量,那么您唯一可以做的就是使用OR
将大量contains
检查链接在一起: (RequestItems.0.Id = :val) OR (RequestItems.1.Id = :val) OR (RequestItems.2.Id = :val) ...
. 不过,这似乎不是一个好主意,除非您事先知道RequestItems
将始终包含一定数量的项目。
contains
不能按您希望的方式工作。 如果您执行contains(path, <some number>)
,DynamoDB 会检查在path
找到的值是否是一组数字以及<some number>
提供的值是否包含在该组中。
鉴于您的数据架构,恐怕您唯一的选择是获取所有项目并在您的代码中过滤它们。
如果这不是权威,我深表歉意。
我怀疑 DynamoDB不能这样做。
此外,DynamoDB 背后的想法是它不应该这样做。
DynamoDB 不支持对数据进行任意函数评估。
DynamoDB 是一个 KV(有点)存储,而不是一个数据库。 “发电机”方式是查询您可能需要的所有行(项目)并在客户端分析列(键)。 请注意,它的成本完全相同(对于发电机,流量差异很小),因为 aws 会向您收取“数据库磁盘读取”之类的费用。 而且它既繁琐又简单,例如,您仍然必须处理分页。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.