DynamoDB:scan()与FilterExpression结合使用多个属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DynamoDB:scan()与FilterExpression结合使用多个属性相关的知识,希望对你有一定的参考价值。

DynamoDB表中的项目具有以下格式:

{
  'id': 1,
  'last_check': 1234556,
  'check_interval': 100,
  ....
}

现在我想扫描表格,找到last_check + check_interval小于某个给定值last_check_time的所有项目。我没有找到一种方法来创建一个结合了两个属性的FilterExpression,所以我目前正在通过以下方式进行:

last_check_time = time.time()
response = status_table.scan(
    ProjectionExpression='id, last_check, check_interval',
    FilterExpression = Attr('last_check').lt(last_check_time)
)
# manually filter the items and only preserve those with last_check + check_interval < last_check_time:
for item in response['Items']:
    if item['last_check'] + item['check_interval'] < last_check_time:
        # This is one of the items I'm interested in!
        ....
    else:
        # Not interested in this item. And I'd prefer to let DynamoDB filter this out.
        continue

有没有办法让DynamoDB进行过滤,从而使上面的例子中的for循环过时了?

答案

遗憾的是,目前无法请求DynamoDB为您执行过滤计算,但您可以创建另一个属性,即两个属性的总和,您可以通过几种方法来实现这一目标。

  1. 在将项目写入DynamoDB时,可能会在代码中计算其他属性(last_check + check_interval)。
  2. 使用DynamoDB触发器创建其他属性(last_check + check_interval)

您可以使用任一选项在要过滤的项目上创建新属性。

以上是关于DynamoDB:scan()与FilterExpression结合使用多个属性的主要内容,如果未能解决你的问题,请参考以下文章

使用保留关键字作为 FilterExpression NodeJS 扫描 DynamoDB 中的函数

调用扫描操作时如何解决 (AccessDeniedException):用户:arn:aws:sts... 无权执行:dynamodb:Scan on resource.."?

如何在DynamoDB中使用group by?

DynamoDb扫描返回本地但不是实时的所有数据

从表中扫描多个电子邮件ID - DynamoDB

使用 lambda 扫描/查询 dynamodb 表中的特定条目