You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以单一属性为过滤条件查询DynamoDB表?附时间与产品名筛选需求

实现DynamoDB中类似SQL WHERE子句的过滤(最近24小时+产品名称匹配)

一、优先使用Query API(高效方案,依赖索引)

如果你的表提前创建了全局二级索引(GSI),将产品名称设为分区键、时间戳设为排序键,用Query是最优解——它直接定位目标分区,再过滤时间范围,性能远高于全表扫描。

示例代码(Python boto3)

import boto3
from datetime import datetime, timedelta

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('你的表名')

# 计算24小时前的时间戳(适配你表中存储的格式,这里用ISO字符串示例)
twenty_four_hours_ago = (datetime.now() - timedelta(hours=24)).isoformat()

response = table.query(
    IndexName='ProductName-Timestamp-index',  # 你的GSI名称
    KeyConditionExpression='ProductName = :name AND #ts >= :time',
    ExpressionAttributeNames={
        '#ts': 'Timestamp'  # 若属性名是DynamoDB保留字,需用别名
    },
    ExpressionAttributeValues={
        ':name': '目标产品名称',
        ':time': twenty_four_hours_ago
    }
)

# 获取匹配记录
matching_items = response['Items']

关键说明

  • 必须提前创建对应GSI,否则无法使用该Query逻辑
  • 时间戳建议存Unix时间戳(数字)或ISO 8601字符串,确保范围比较的准确性

二、用Scan API(无索引时的兜底方案)

如果没有合适的索引,只能用Scan全表扫描,通过FilterExpression实现过滤逻辑。注意:Scan会遍历全表,数据量大时性能极差,仅作为临时或小表场景的备选。

示例代码(Python boto3)

import boto3
from datetime import datetime, timedelta

dynamodb = boto3.resource('dynamodb')
table = dynamodb.Table('你的表名')

twenty_four_hours_ago = (datetime.now() - timedelta(hours=24)).isoformat()

response = table.scan(
    FilterExpression='ProductName = :name AND #ts >= :time',
    ExpressionAttributeNames={
        '#ts': 'Timestamp'
    },
    ExpressionAttributeValues={
        ':name': '目标产品名称',
        ':time': twenty_four_hours_ago
    }
)

matching_items = response['Items']

# 处理分页(Scan单次最多返回1MB数据,需循环获取剩余结果)
while 'LastEvaluatedKey' in response:
    response = table.scan(
        FilterExpression='ProductName = :name AND #ts >= :time',
        ExpressionAttributeNames={
            '#ts': 'Timestamp'
        },
        ExpressionAttributeValues={
            ':name': '目标产品名称',
            ':time': twenty_four_hours_ago
        },
        ExclusiveStartKey=response['LastEvaluatedKey']
    )
    matching_items.extend(response['Items'])

核心要点

  • FilterExpression就是DynamoDB实现类似SQL WHERE的核心,支持=、>=、<=、BETWEEN等多种运算符
  • 分页逻辑不可省略,否则会丢失超过1MB的匹配数据

通用注意事项

  • 永远优先选择Query+索引的方案,Scan仅作为无索引时的临时妥协
  • 确保时间戳的存储格式统一,避免因类型不匹配导致过滤失效
  • 若属性名是DynamoDB保留字(如Time、Date),必须通过ExpressionAttributeNames定义别名规避冲突

内容的提问来源于stack exchange,提问作者yaminimyn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 07:17:45