Amazon dynamodb DynamoDB查询限制

Amazon dynamodb DynamoDB查询限制,amazon-dynamodb,dynamodb-queries,Amazon Dynamodb,Dynamodb Queries,我对DynamoDB上的查询/扫描的限制有疑问 我的表有1000条记录,对所有记录的查询都返回50个值,但如果我将限制设置为5,这并不意味着查询将返回前5个值,它只表示查询表中的5个项(以任何顺序,因此它们可能是非常旧的项或新的项),因此我可能在查询中得到0个项。如何实际获取查询的最新5项?我需要将限制设置为5(数字是示例),因为查询/扫描更多的项目会非常昂贵 该查询具有此输入 { TableName: 'transactionsTable', IndexName: 'transacti

我对DynamoDB上的查询/扫描的
限制有疑问

我的表有1000条记录,对所有记录的查询都返回50个值,但如果我将
限制设置为5,这并不意味着查询将返回前5个值,它只表示查询表中的5个项(以任何顺序,因此它们可能是非常旧的项或新的项),因此我可能在查询中得到0个项。如何实际获取查询的最新5项?我需要将
限制设置为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
对它们进行排序,但是,我如何确定查询将查找所有项目

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

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

因此,为了高效地完成您想做的事情,您需要考虑一种不同的数据建模方法,即,如何组织分区和排序键。有不同的方式去做,每个都有它自己的好处和缺点,你需要考虑你自己的选择。既然您询问了GSI,我将给您一些关于如何使用该选项的提示:

您正在寻找的模式称为。如您所述,如果使用排序键为
createdAt
的GSI,您可以首先检索最新的项目。但您仍然需要进行筛选,并且仍然不知道如何在5个筛选结果(而不是5个预筛选)后停止。解决方案是要求DynamoDB首先只将通过过滤的项目放入GSI。在您的示例中,似乎总是使用相同的过滤器:“状态=付款\网关”。DynamoDB在构建GSI时没有运行通用过滤函数的选项,但它有一个不同的技巧来实现相同的功能:任何时候设置“status=payment\u gateway”,也设置另一个属性“status\u payment\u gateway”,当status设置为其他属性时,删除“status\u payment\u gateway”。现在,使用“状态支付网关”作为分区键创建GSI。DynamoDB只会将具有此属性的项目放入GSI中,从而完全实现您想要的过滤

通过将partition key属性设置为多个不同的值,还可以在一个GSI中具有多个互斥的筛选条件,然后可以分别对这些值中的每个值执行
查询
(使用
KeyConditionExpression