【问题标题】:Scanning With sort_key in DynamoDB在 DynamoDB 中使用 sort_key 进行扫描
【发布时间】:2021-07-17 23:12:27
【问题描述】:

我有一个表,其中包含

当前表配置

我是否需要为分区使用一次性密钥才能获得按日期返回的结果?也许我的桌子的大小一开始就不合理?有没有更好的方法来处理这个?我有另一个字段“is_active”,它当前是一个布尔值,如果我将它转换为数字,它可以用于分区键,但这可能会使我的更新方法复杂化。 95% 的情况下,数据库中的每个条目都是“活跃的”,所以这似乎效率不高。

扫描索引

let params = {
    TableName: this.TABLE_NAME,
    IndexName: this.INDEX_NAME,
    ScanIndexForward: false,
    ProjectionExpression: "id",
    FilterExpression: filterSqlStatement,
    ExpressionAttributeValues: filterValues,
    ExpressionAttributeNames: {
      "#n": "name"
    }
};
let results = await this.DDB_CLIENT.scan(params).promise();
let finalizedResults = results ? results.Items : [];

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb dynamodb-queries


    【解决方案1】:

    鉴于您的数据集相对较小,您可以尝试使用带有日期和 UUID 排序键的固定分区键。您将通过分区键(这将是一个固定值)进行查询,结果将返回排序。对于大型数据集,这不是最好的主意,但

    【讨论】:

    • 我在想我的另一个选择是在没有排序键的情况下恢复我以前的模式(所以我可以继续只使用 id 进行查询和 batchGet),然后在 API 端对返回的 id 进行排序在将它们返回给客户之前。我的理解是,由于我正在执行扫描,所以我是否只返回 id 或 id 和 create_date 并不重要,因为我已经迭代了所有条目。
    • 如果您需要能够获得,那么我建议采用不同的方法。在表上仅使用带有 UUID 的分区键。使用我建议的数据添加 GSI。查询 GSI。您没有理由一次获取所有数据。即使您想进行过滤,您也可以在 DynamoDB 中进行过滤,并且仍然可以将数据重新排序。
    • 确认...您建议基表具有 uuid 的主键并且没有排序键。然后添加一个以 is_active(或类似的固定值)作为主键并以 create_date 作为排序键的 GSI。对于我返回与过滤器匹配的条目的 ID 的初始过滤扫描,查询 GSI 而不是基表。如果我想针对其他字段进行过滤,我是否需要在 GSI 中包含非关键属性,或者 Dynamo 是如何知道的?
    • 没错。您需要在 GSI 中包含非关键属性以对其进行过滤。您的数据很小,所以我会将所有内容都投影到 GSI 中。
    • 非常感谢您的洞察力!我已经阅读了很多文档和其他问答,但是当您来自关系 SQL 背景时,了解排序键、GSI 和 LSI 的区别和应用似乎并非易事。 :)
    猜你喜欢
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    相关资源
    最近更新 更多