繁体   English   中英

DynamoDB 查询限制

[英]DynamoDB Limit on query

我对 DynamoDB 上的查询/扫描Limit有疑问。

我的表有 1000 条记录,对所有记录的查询都返回 50 个值,但是如果我将Limit设置为 5,这并不意味着查询将返回前 5 个值,它只是说查询 5 个项目表(以任何顺序排列,因此它们可能是非常旧的项目或新项目),所以我可能在查询中得到 0 个项目。 如何实际获取查询的最新 5 项? 我需要将Limit设置为 5(数字是示例),因为查询/扫描比这更多的项目会很昂贵。

查询有这个输入

{
  TableName: 'transactionsTable',
  IndexName: 'transactionsByUserId',
  ProjectionExpression: 'origin, receiver, #valid_status, createdAt, totalAmount',
  KeyConditionExpression: 'userId = :userId',
  ExpressionAttributeValues: {
    ':userId': 'user-id',
    ':payment_gateway': 'payment_gateway'
  },
  ExpressionAttributeNames: {
    '#valid_status': 'status'
  },
  FilterExpression: '#valid_status = :payment_gateway',
  Limit: 5
}

我的表的索引是这样的:

在此处输入图像描述

我是否应该使用第二个索引或其他索引来使用createdAt字段对它们进行排序,但是我如何确定查询将查看所有项目?

如果我将 Limit 设置为 5,这并不意味着查询将返回前 5 个值,它只是表示查询表中的 5 个项目(以任何顺序,因此它们可能是非常旧的项目或新项目) ,所以我可能在查询中得到 0 个项目。 如何实际获取查询的最新 5 项?

您的观察是正确的,不幸的是,没有Query选项或任何其他操作可以保证单个请求中有 5 个项目。 要理解为什么会这样(这不仅仅是亚马逊方面的懒惰),请考虑以下极端情况:您有一个包含 10 亿个项目的庞大数据库,但是执行一个非常具体的查询,其中只有 5 个匹配项目,现在进行请求您想要的:“还我 5 件物品”。 这样的请求需要读取包含十亿个项目的整个数据库,然后才能返回任何内容,到那时客户端肯定会放弃。 所以这不是 DyanmoDB 的Limit的工作原理。 它限制了 DyanamoDB 在响应之前需要完成的工作量。 因此,如果Limit = 100 ,DynamoDB 将在内部读取 100 个项目,这需要一定的时间。 但是你是对的,你不知道它会响应 100 个项目(如果所有项目都匹配过滤器)还是 0 个项目(如果它们都不匹配过滤器)。

因此,为了高效地做您想做的事情,您需要想出一种不同的方式来 model 您的数据 - 即,如何组织分区和排序键。 有不同的方法可以做到这一点,每个都有自己的优点和缺点,你需要自己考虑你的选择。 既然你问过 GSI,我会给你一些关于如何使用该选项的提示:

您正在寻找的模式称为filtered data retrieval 如您所述,如果您使用排序键createdAt执行 GSI,则可以首先检索最新的项目。 但是你仍然需要做一个过滤器,并且仍然不知道如何在 5 个过滤结果(而不是 5 个预过滤)结果后停止。 解决方案是要求 DynamoDB 仅首先将通过过滤的项目放入 GSI。 在您的示例中,您似乎总是使用相同的过滤器:“status = payment_gateway”。 DynamoDB 在构建 GSI 时没有运行通用过滤器 function 的选项,但它有一个不同的技巧来实现同样的事情:任何时候设置“status = payment_gateway”,同时设置另一个属性“status_payment_gateway” ,当状态设置为其他内容时,删除“status_payment_gateway”。 现在,使用“status_payment_gateway”作为分区键创建 GSI。 DynamoDB 只会将具有此属性的项目放入 GSI,从而实现您想要的过滤。

通过将分区键属性设置为多个不同的值,您还可以在一个 GSI 中拥有多个互斥的过滤条件,然后您可以分别对每个值执行Query (使用KeyConditionExpression )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM