【问题标题】:DynamoDB queryPage operation with FilterExpression returning empty result as well as lastEvaluatedKeyDynamoDB queryPage 操作与 FilterExpression 返回空结果以及 lastEvaluatedKey
【发布时间】:2016-04-28 10:48:21
【问题描述】:

据我了解。 查询操作将在提到的索引上查找结果,直到满足以下条件之一

  • 结果集已用尽。
  • 检索到的项目数达到 Limit 参数的值(如果指定)。
  • 检索的数据量达到最大结果集大小限制 1 MB。 记录在案Here

因此 DynamoDB 查询将根据上述条件获取结果,然后应用 FilterExpression,因此它很可能不会向您返回任何结果,因此它将返回空集和 LastEvaluatedKey

但我在documentation中也读到了以下内容

与 Scan 操作不同,Query 操作从不返回空结果集和 LastEvaluatedKey 值。

有人可以帮忙解释一下上述文档声明的实际含义吗?

因为在实践中,当我使用 limitFilterExpression 使用 queryPage API 时,我得到了相反的结果,即我得到一个空集以及 LastEvaluatedKey。

我的上述理解正确吗?是否可以获得空结果和 lastEvaluatedKey 值?或者我错过了一些东西,因为我得到了空的结果? (根据文档我不应该得到它。如果我没有得到空结果会很棒)

【问题讨论】:

  • 您可能会获得密钥,但您是否也在 lastEvaluatedKey 中获得了价值?
  • 是的。我正在获取价值。
  • From here 过滤器被 dynamo 应用于查询的结果,所以也许您查询到了响应的限制,然后您的过滤器将它们清除了?在没有过滤器的情况下尝试相同的查询应该会让您知道。

标签: pagination amazon-dynamodb


【解决方案1】:

我也遇到了和你一样的问题,阅读文档后,我发现以下描述解释了原因。根据亚马逊文档,“在查询操作中,DynamoDB 按排序顺序检索项目,然后使用 KeyConditionExpression 和可能存在的任何 FilterExpression 处理项目。”

所以它解释了为什么你会得到这些结果。过滤操作是在查询结果之后进行的,所以无论你是否应用FilterExpression,Query操作都没有区别,所以你看到lastEvaluatedKey出现了,和没有应用FilterExpression的没有区别。

因此,实现您想要的唯一可能的方法是使用全局二级索引,您要过滤的列,您可以将其作为排序键。这种情况下可以用RangeKeyCondition()查询。

【讨论】:

    【解决方案2】:

    他们更新了文档,并根据您的经验进行了更新。 从问题中的文档链接: 笔记: 如果为结果页读取的所有项目都被过滤掉,则 Query 操作可以返回空结果集和 LastEvaluatedKey。

    【讨论】:

      猜你喜欢
      • 2018-04-02
      • 1970-01-01
      • 2019-09-21
      • 2021-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多