使用FilterExpression(contains)进行aws-sdk-dyneodb扫描操作会导致空项



我正试图用contains FilterExpression从AWS Dynamo DB扫描中获取数据。我使用以下参数,但收到空响应

{"项目":[],"计数":0,"扫描计数":792,"上次评估密钥":{"ID":"b123456789"}

我想根据数组中的字符串进行过滤,例如:水果中的橙色:['orage','apple','banan'];

扫描操作参数:

params={TableName:表,FilterExpression:";含有(水果:L(";,表达式属性值:{":L":{S:"橙色"}}}

但当我使用与AWS CLI相同的命令时。我正在获取以下格式的数据:

{项目:{水果:{L:{S:橙色}}}},{}}}

你能告诉我我使用的参数出了什么问题吗。

要了解这里发生了什么,您需要了解DynamoDB是如何过滤数据和对结果进行分页的。它按以下顺序发生:

  1. 从表中读取项目
  2. 应用筛选器
  3. 返回结果

DynamoDBqueryscan操作一次最多返回1MB的数据。除此之外的任何内容都将被分页。如果DynamoDB在您的响应中返回LastEvaluatedKey元素,您就知道您的结果正在分页。

过滤器在1MB限制之后应用。这是一个经常让人措手不及的关键步骤。在您的情况下,以下情况正在发生:

  1. 执行scan操作,从表中读取1MB的数据
  2. 您对1MB响应应用了一个筛选器,这将导致第一步中的所有记录都从响应中删除
  3. DDB返回带有LastEvaluatedKey元素的剩余项目,这表示还有更多的数据要搜索

换句话说,您的筛选器没有应用于整个表。它一次应用于1MB的表。为了得到您想要的结果,您需要重复执行scan操作,直到到达最后一个";页面";表中的。

最新更新