gpt4 book ai didi

amazon-dynamodb - DynamoDB 查询限制

转载 作者:行者123 更新时间:2023-12-05 01:10:55 30 4
gpt4 key购买 nike

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

我的表有 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
}

我的表的索引是这样的:

enter image description here

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

最佳答案

if I put a Limit of 5, that doesn't mean that the query will return the first 5 values, it just say that query for 5 Items on the table (in any order, so they could be very old items or new ones), so it's possible that I got 0 items on the query. How can actually get the latest 5 items of a query?

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

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

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

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

关于amazon-dynamodb - DynamoDB 查询限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63680861/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com