繁体   English   中英

使用嵌套集合时,Dynamo DB 查询未返回预期结果

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM