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

为分页Boto3 DynamoDB Scan添加过滤表达式遇问题求助

问题解决:DynamoDB分页扫描添加过滤条件

一、分页器Scan过滤条件报错的原因及修复

你使用的是boto3.client的分页器,而Attr()是boto3.resource专属的条件构造语法,client端的API要求FilterExpression必须是字符串格式,同时需要配合ExpressionAttributeValues传递变量值,不能直接传入resource的条件对象。

方案1:直接写字符串格式的过滤表达式

import boto3

dynamodb = boto3.client('dynamodb')
dynamores = boto3.resource('dynamodb')
table = dynamores.Table('table')

pagination_config = {"MaxItems": 2, "PageSize": 2}

paginator = dynamodb.get_paginator('scan')
response_iterator = paginator.paginate(
    TableName=table.table_name,
    PaginationConfig=pagination_config,
    FilterExpression="contains(Email, :user) AND contains(Category, :types)",
    ExpressionAttributeValues={
        ":user": {"S": user},  # S代表字符串类型,根据字段实际类型调整:N=数字,BOOL=布尔
        ":types": {"S": types}
    }
)

# 遍历分页结果
for page in response_iterator:
    print(page['Items'])

方案2:用Attr()构造后转成client兼容格式

如果习惯用Attr()语法,可以通过build_expression()方法把条件对象转换成client需要的参数:

import boto3
from boto3.dynamodb.conditions import Attr

dynamodb = boto3.client('dynamodb')
dynamores = boto3.resource('dynamodb')
table = dynamores.Table('table')

pagination_config = {"MaxItems": 2, "PageSize": 2}

# 用Attr构造条件
condition = Attr("Email").contains(user) & Attr("Category").contains(types)
# 转换为client兼容的表达式和参数
expr = condition.build_expression()

response_iterator = paginator.paginate(
    TableName=table.table_name,
    PaginationConfig=pagination_config,
    FilterExpression=expr['FilterExpression'],
    ExpressionAttributeValues=expr['ExpressionAttributeValues']
)

二、JMES搜索无结果的修复

你的JMES路径写错了:DynamoDB scan分页返回的结果中,数据存储在Items字段下,而非Contents;同时client返回的字段会带类型标识(比如字符串字段是字段名.S),正确写法如下:

response_iterator = paginator.paginate(
    TableName=table.table_name,
    PaginationConfig=pagination_config
)

# 修正JMES路径,注意字段的类型后缀
filtered_iterator = response_iterator.search("Items[?contains(Category.S, 'File Status')]")

# 遍历过滤后的结果
for item in filtered_iterator:
    print(item)

三、关于operation_parameters参数

分页器的paginate()方法不需要通过operation_parameters传递过滤条件,直接将FilterExpression、ExpressionAttributeValues等参数写在方法参数中即可,operation_parameters多用于传递特殊场景的额外操作参数。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 05:46:06