具有过期 IP 地址的用户的 DynamoDB 查询

DynamoDB Query for users with expired IP addresses

所以我有一个 DynamoDB 数据库 table 看起来像这样(导出到 csv):

"email (S)","created_at (N)","firstName (S)","ip_addresses (L)","lastName (S)","updated_at (N)"
"name@email","1628546958.837838381","ddd","[  { ""M"" : {      ""expiration"" : { ""N"" : ""1628806158"" },      ""IP"" : { ""S"" : ""127.0.0.1"" }    }  }]","ddd","1628546958.837940533"

我希望能够对所有过期的 IP(附加到用户的属性)进行“查询”而不是“扫描”。时间以unix时间存储。

现在我正在扫描整个 table 并逐个查看每个用户,然后循环查看他们的所有 IP 以查看它们是否已过期。但我需要使用查询来执行此操作,扫描很昂贵。

table布局是这样的:

主键 = 电子邮件 attributes = firstName, lastName, ip_addresses({} 映射数组,其中每个映射都有 IP,Expiration 作为两个键)。

我不知道如何使用查询来执行此操作,所以如果有人能告诉我如何操作,我将不胜感激! :)

我目前正在 运行 使用 python 和 boto3 进行扫描,如下所示:

response = client.scan(
        TableName='users',
        Select='SPECIFIC_ATTRIBUTES',
        AttributesToGet=[
            'ip_addresses',
        ])

根据 boto3 文档,查询操作根据主键值查找项目。您可以查询任何具有复合主键(分区键和排序键)的 table 或二级索引。

使用 KeyConditionExpression 参数为分区键提供特定值。查询操作将 return 来自 table 的所有项目或使用该分区键值编制索引。您可以选择通过在 KeyConditionExpression 中指定排序键值和比较运算符来缩小查询操作的范围。要进一步细化查询结果,您可以选择提供 FilterExpression 。 FilterExpression 确定结果中的哪些项目应该 returned 给你。所有其他结果都被丢弃。

长话短说,它只会获取您在 运行 查询时提到其主键的特定行。

一个查询操作总是return一个结果集。如果没有找到匹配项,结果集将为空