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

Nodejs DynamoDB文档客户端筛选器表达式未应用于LastEvaluatedKey?

俞涵涤
2023-03-14

当我执行扫描时,我需要应用一个过滤器来确保只返回我需要的记录类型。我注意到的是,返回的LastEvalue atedKey没有考虑到应用的Filter表达式。

我的(扫描)查询:

{
    TableName: 'my_table',
    ExpressionAttributeNames: { '#pk': 'pk', '#sk': 'sk' },
    ExpressionAttributeValues: { ':pk': '$bugbeater_1#sector_', ':sk': '$test_entity#id_' },
    FilterExpression: '(begins_with(#pk, :pk) AND begins_with(#sk, :sk))'
}

返回的LastEvaluatedKey

{
    pk: '$bugbeater_1#sector_0add31a7-500d-4849-b679-8eb5bd220889',
    sk: '$test#id_1ea21ed0-875d-4432-852f-07c316c12389'
}

我可以理解这可能是DynamoDB更基本的实现细节,而不是DocumentClient的问题。当使用单个表设计时,它确实使api更难使用。

我的表中有多个实体,并非所有实体都是“公共”的和/或针对同一租户。如果我只使用LastEvaluatedKey值而不进行额外的处理,并将该值返回给客户端进行可能的分页,那么我可能会将密钥泄漏给其他租户/实体。

总的来说,我希望确保这种情况不会发生;这种情况有官方的行动方案吗?

更具体地说,对于我的用例,我能够识别返回的LastEvaluatedKey是否实际匹配预期的pk/sk。也就是说,在我的例子中,我可以计算一个键是否与给定实体的模式匹配。

鉴于DynamoDB架构,是否可以假设如果SK与我的实体不匹配,它可以被视为一个完整的查询,没有进一步的分页?例如,我正在寻找SortKey从$test_entity#id_开始但LastEvalue atedKey$test#id_开始的记录,我是否可以假设返回$test#id_,因为它在$test_entity#id_之后排序因此所有记录与$test_entity#id_已用尽?

我希望所有这些都是有意义的,如果您需要更多的例子、细节或澄清,请让我知道,我可以提供帮助解决此问题所需的任何东西。

共有1个答案

卢才艺
2023-03-14

根据DynamoDB文档,您可以在扫描时使用FilterExpression。是什么让你觉得情况并非如此?

您暗示要将LastEvalue atedKey返回到服务器以进行后续分页请求,但没有显示代码。您是否确保将第一个请求中的最后一个计算键指定为下一个扫描请求的ExclusiveStartKey

听起来你已经有了在DynamoDB中分页扫描的正确心理模型,但是只需要解决你的实现中的问题。

编辑:

因澄清评论而更新。听起来您正试图根据LastEvaluatedKey的值来确定何时停止分页。这样做将推断扫描操作以特定的排序顺序发生。我在文件中找不到任何证据支持这一说法。

在应用筛选器表达式之前,扫描操作有1 MB的限制。LastEvalue atedKey仅标识操作在达到1 MB限制之前的进展情况。在第一次请求之后,DDB如何知道您没有更多与筛选条件匹配的属性?

例如,如果表中有以下项目会怎样:

{
  pk:`$bugbeater_1#sector_A`
  sk: `$test_entity#id_A`
}

此结果将显示扫描结果的哪一页?您能告诉我它是在原始问题中概述的LastEvaluatedKey之前还是之后吗?

我建议遵循DynamoDB文档的建议:“缺少LastEvalue atedKey是知道您已经到达结果集末尾的唯一方法”。

既然您可以访问数据集,那么如果您继续分页,您会发现什么?您是否找到符合Filter条件的结果?

 类似资料:
  • 我在正确表达ElasticSearch regexp过滤器的regexp时遇到了问题。我正在尝试匹配url字段中“info-for/media”中的任何内容,例如http://mydomain.co.uk/info-for/media/press-release-1。为了尝试获得正确的正则表达式,我现在使用,但最终将是带有用户查询字符串的。 发布到localhost:9200/_search 这返

  • 如何重构我的代码,以便我的 for 表达式中没有 if 语句? 我得到一个执行异常: 我正在下面定义一个if选项,这导致了问题: 我应该开始使用什么模式来避免此错误?

  • 我已经在该表上创建了DynamoDB表和全局辅助索引。我需要从该表的GSI中获取所有数据。 有两种选择: 无筛选表达式的扫描操作 我需要找出哪一个性能更好,以便我开始我的实现。 我已经读了很多关于DynamoDB扫描和查询操作,但可以解决我的查询。 请帮我解决我的问题。 提前谢谢。 阿披实

  • 我试图为我的应用程序实现SSE。我的客户端是角4应用程序,我使用EventSourcePoly填充(使其也适用于IE)。我的服务器端是Spring,我使用Spring SseEmitter进行相同的操作。 我根据客户端的特定用户事件打开一个新的SSE连接。我可以看到请求到达服务器,SSE事件被记录,我可以看到响应也被创建。我想以json的形式发送响应。我基本上是在尝试发送数据更新,并且正在使用更新

  • 我有一个智能表,我正在AngularJS工作。该表使用自定义管道来搜索和排序其数据。我还要求表具有工作分页,以及一个下拉框,以便您可以选择要显示的行数(想想数据)。 对于搜索和排序,自定义管道可以毫无问题地触发我的ajax请求。但是,当我单击任何页码或更改要显示的行数时,管道不会被触发。 页码似乎被设置为调用setPage(page)(这是由st pagination指令设置的),但是什么也没有发

  • 本文向大家介绍python 用正则表达式筛选文本信息的实例,包括了python 用正则表达式筛选文本信息的实例的使用技巧和注意事项,需要的朋友参考一下 本文主要介绍如何对多个文本进行读取,并采用正则表达式对其中的信息进行筛选,将筛选出来的信息存写到一个新文本。 文本基础操作 打开文件:open(‘文件名',‘打开方式')>>>file=open(r'C:\Users\yuanlei\Desktop