当前位置: 首页 > 知识库问答 >
问题:

AWS DynamoDB向后扫描忽略最后评估的键

归明诚
2023-03-14

我使用AWS托管API网关和DynamoDB直接集成。

我现在正在尝试为我的应用程序添加分页功能,我很难100%实现它。我面临的问题是当我向后扫描时,我会给你一个例子来更好地理解这个问题。

想象一下,我有一个包含20个项目的列表,页面大小为5。

  1. 当我查询我的表时,第一个查询将返回1,2,3,4,5。预期的行为
  2. 当我查询表时,将第五个元素中的lastEvaluatedKey传递给它,它返回6,7,8,9,10。预期行为。
  3. 现在,当我使用标志ScanIndexForward=false进行查询时,问题就出现了。这意味着我不想前进。相反,我需要lastEvaluatedKey中前面的项目。问题是,如果我使用上一次查询中检索到的lastEvaluatedKey,而不是像5,4,3,2,1,我就得到了4,3,2,1

将跳过lastEvaluatedKey中的元素,或者如果需要,将其称为head

如果您想象一个表中的正常行为,单击下一页和上一页,这意味着当您转到第二页并返回到第一页时,对于建议的场景,您只会得到4项,而不是一项。

最后,我用awscli尝试了相同的查询,结果是相同的。在与支持人员聊天后,他们确认这是预期的行为。

我只想知道人们是如何对待这种情况的,因为我知道亚马逊在生产中使用它,所以应该有一种方法。

共有1个答案

侯焱
2023-03-14

为了理解您所看到的行为,您需要理解 ListEdValueKEY < /C>的最初目的不是以查询的方式对某个地方进行随机访问,而是在页面边界停止后恢复查询。记住这一点,当 ScanIndexForward=false时,它假定它正在继续进行反向查询;因此,如果您传递 LastEvaluatedKey=5,它假定先前返回的序列是10、9、8、7、6、5(最后返回的项目是5),那么现在将继续传递到4、3、2、1。正如你所说的那样。

如果出于您的目的,您也需要“5”项,您可以在单独的请求中单独阅读该项。这不会花你更多的钱,因为亚马逊根据阅读项目大小向你收费——当多个项目在同一个查询中返回时,这并不便宜。如果并行执行读取和查询,延迟也不会增加。

更新:

正如Charles在下面的评论中所指出的,对于短项目和短页面,额外的GetItem请求“5”实际上会花费您另一个RCU,这可能很重要,所以这不是一个好主意。

所以还有另一个选择,那就是根本不使用LastEvaluatedKey。相反,Query允许您在KeyConditionExpression中不仅指定所需的分区键,还指定一系列排序键。您可以指定范围“排序”

 类似资料:
  • 我的程序需要接受整数、单个字符或一个特定字符串(本例中我将使用)。虽然每一个都可以用空格分隔,但不需要这样做。 目前,我的解析代码依赖于,如下所示: 目前,我的程序将接受输入像没有任何问题。然而,它也应该接受相同的输入,没有任何空白(),并以相同的方式解释它,并且在我当前的代码中,单个数字被错误地解释为字符。 我觉得原因可能是我使用的正则表达式。但是,添加

  • 我正在编写一段代码,对给定的后缀表达式求值。每个操作数和运算符之间用空格分隔,最后一个运算符后跟空格和“x”。 例子: 内插表达式:(2*3 4)*(4*3 2) 后缀表达式:23*443*2*x “x”暗示表达的结束。 输入(后缀表达式)作为字符串由另一个函数给出,该函数将内缀表达式转换为后缀表达式。 后缀评估的功能是: 我给出的例子的输出应该是“140”,但我得到的是“6”。请帮我找出错误。

  • 本文向大家介绍评估后缀表达式,包括了评估后缀表达式的使用技巧和注意事项,需要的朋友参考一下 为了求解数学表达式,我们需要前缀或后缀形式。将中缀转换为后缀后,我们需要后缀评估算法来找到正确的答案。 在这里,我们还必须使用堆栈数据结构来解决后缀表达式。 从后缀表达式中,找到一些操作数后,将它们压入堆栈。找到某个运算符后,将从堆栈中弹出两个项目,并按正确的顺序执行操作。之后,结果也被压入堆栈中以备将来使

  • 在隐马尔科夫模型HMM中,我们讲到了HMM的三个基本问题,而linear-CRF也有三个类似的的基本问题。不过和HMM不同,在linear-CRF中,我们对于给出的观测序列x是一直作为一个整体看待的,也就是不会拆开看$$(x_1,x_2,...)$$,因此linear-CRF的问题模型要比HMM简单一些,如果你很熟悉HMM,那么CRF的这三个问题的求解就不难了。 linear-CRF第一个问题是评

  • 1. 回顾HMM问题一:求观测序列的概率 首先我们回顾下HMM模型的问题一。这个问题是这样的。我们已知HMM模型的参数$$lambda = (A, B, Pi)$$。其中A是隐藏状态转移概率的矩阵,B是观测状态生成概率的矩阵,$$Pi$$是隐藏状态的初始概率分布。同时我们也已经得到了观测序列$$O ={o_1,o_2,...o_T}$$,现在我们要求观测序列O在模型$$lambda$$下出现的条件