使用过滤器表达式从dynamo db查询返回固定数量的项



我正试图从dynamo db表中检索固定数量的项目(现在让它作为5)。

这是我正在使用的代码。

response = table.query(
KeyConditionExpression=Key('pk').eq('goo'),
Limit=5,
FilterExpression=Attr('goo').eq('bar'))

我从中只得到4个项目。但是如果我删除FilterExpression,项目计数将是5。那么,是否有其他方法来获得固定数量的项目,即使我使用FilterExpression?

在之后应用过滤器表达式从表中读取项是为了减少通过网络发送的记录数量。Limit在查询操作期间应用,即在过滤器表达式之前。

如果Query读了5个项目,其中只有4个与FilterExpression匹配,你只得到4个项目。

务实的事情是从Query中删除限制并应用限制客户端。缺点是您可能需要支付更多的读容量单位。

如果你想避免这种情况,你可能不得不重新考虑你的数据模型——在这里很难找到一个通用的解决方案。


特定的情况下,您可以使用分区键pk和排序键goo创建一个全局二级索引(对于gsi来说,它不必是唯一的)。然后你可以用Limit 5对GSI进行查询,它会给你你想要的。但是:你为GSI存储+吞吐量付费。


编辑:除了Python代码

之外,这个问题几乎是重复的

这是我找到的答案

paginator = dynamo_db_client.get_paginator('query')
response_iterator = paginator.paginate(
TableName='table_name',
KeyConditionExpression='#P=:p',
FilterExpression='#T=:t',
ExpressionAttributeNames={'#P':'pk','#T':'goo'},
ExpressionAttributeValues={
':p': {'S':'goo'},
':t': {'S':'bar'}
},
PaginationConfig={
'MaxItems':5
}     
)

for page in response_iterator:
print(len(page['Items']))

paginator doc链接:DynamoDB.Paginator.Query

最新更新