我正试图用contains FilterExpression从AWS Dynamo DB扫描中获取数据。我使用以下参数,但收到空响应:
{"项目":[],"计数":0,"扫描计数":792,"上次评估密钥":{"ID":"b123456789"}
我想根据数组中的字符串进行过滤,例如:水果中的橙色:['orage','apple','banan'];
扫描操作参数:
params={TableName:表,FilterExpression:";含有(水果:L(";,表达式属性值:{":L":{S:"橙色"}}}
但当我使用与AWS CLI相同的命令时。我正在获取以下格式的数据:
{项目:{水果:{L:{S:橙色}}}},{}}}
你能告诉我我使用的参数出了什么问题吗。
要了解这里发生了什么,您需要了解DynamoDB是如何过滤数据和对结果进行分页的。它按以下顺序发生:
- 从表中读取项目
- 应用筛选器
- 返回结果
DynamoDBquery
和scan
操作一次最多返回1MB的数据。除此之外的任何内容都将被分页。如果DynamoDB在您的响应中返回LastEvaluatedKey
元素,您就知道您的结果正在分页。
过滤器在1MB限制之后应用。这是一个经常让人措手不及的关键步骤。在您的情况下,以下情况正在发生:
- 执行
scan
操作,从表中读取1MB的数据 - 您对1MB响应应用了一个筛选器,这将导致第一步中的所有记录都从响应中删除
- DDB返回带有
LastEvaluatedKey
元素的剩余项目,这表示还有更多的数据要搜索
换句话说,您的筛选器没有应用于整个表。它一次应用于1MB的表。为了得到您想要的结果,您需要重复执行scan
操作,直到到达最后一个";页面";表中的。