我对DynamoDB上的查询/扫描限制有疑问。
我的表有1000条记录,对所有记录的查询都返回50个值,但是如果我把Limit
设为5,这并不意味着查询将返回前5个值,它只是说对5个项目的查询表(以任何顺序,所以它们可能是非常旧的项目或新的项目),所以我有可能在查询中得到0个项目。如何实际获得查询的最新5项?我需要设置一个Limited
为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”。现在,用“status\u payment\u gateway”作为分区键创建GSI。DynamoDB只会将具有此属性的项目放入GSI中,从而完全实现您想要的过滤。
通过将partition key属性设置为多个不同的值,还可以在一个GSI中具有多个互斥的筛选条件,然后可以分别对这些值中的每个值执行
查询
(使用
KeyConditionExpression
)。
我不了解DynamoDb中查询/扫描限制的概念。根据文件: 单个查询操作最多可以检索1 MB的数据。在对结果应用任何FilterExpression之前,此限制适用。 假设我有10k个条目,每个条目250kb,所有条目都符合查询参数。 如果我运行一个简单的查询,我只得到4个项目?
DynamoDB的文档中说: 在查询操作中,DynamoDB按排序顺序检索项目,然后使用可能存在的任何过滤表达式(FilterExpression)和关键字条件表达式(KeyConditionExpression)处理项目。 以及: 单个查询操作最多可以检索1 MB的数据。在将任何应用于结果之前,此限制适用。 这是否意味着在此1MB限制之前应用了关键条件表达式?
我刚开始在DynamoDB上建一个社交网站。 我将有相当数量的数据与一个用户相关,我计划将这些全部放入一个表中--例如: 用户ID 出生日期 头发 照片URL 详细信息 可能有几百个属性。 问题: 将这么多数据放入一个表中有什么问题吗? 我如何查询该数据(我是否可以执行类似这样的查询:“所有在这个年龄,这个颜色头发,这个位置,并且这次登录的成员)-假设所有这些数据都包含在表中? 如果一个表的内容很
目前我使用table.query通过匹配分区键和排序键来获取项目。现在新的要求是处理批处理查询-几百个分区键匹配,希望仍然按照每个分区键结果中的排序键进行排序。我发现GetBatchItem每个查询最多可以处理100个项目,但看起来没有排序。这里的一项是DDB中的一行还是一个分区键中的所有行?从性能(查询速度)和价格角度来看,我应该使用哪一个?如果我使用GetBatchItem,我必须自己对结果进
我有一个DynamoDB表,其中有一个字母数字字符串作为哈希键(例如“D4ED6962-3EC2-4312-A480-96ECBB48C9DA”)。我需要根据表中的另一个字段查询该表,因此我需要我的查询选择所有键,例如我的字段x在dat x和date y之间。 我知道我需要在哈希键上设置一个条件,在范围键上设置另一个条件,但是我很难编写一个不将查询绑定到特定ID的哈希键条件。 我以为我可以使用一个
我有一个要求,在Dynamodb中查询表时只需要返回一行。我可以在aws cli中看到一个名为“max items”的参数,它显然限制了查询的结果大小。以下是示例查询: 但我无法在Go中找到任何类似的关键字/属性。 以下是我可以找到的相关内容:如何使用Java设置DynamoDB返回的匹配项的限制?