【问题标题】:Dynamodb Query/Scan nested documents. Specifying GSIDynamodb 查询/扫描嵌套文档。指定 GSI
【发布时间】:2020-02-03 22:08:00
【问题描述】:

我有以下 DynamoDb 文档的结构

{
 "studentName"(PK): "Ben",

 "studendId":  123,

 "UpdatedTimestamp"(SortKey): 1221432432

 "Subjects": [

      {
       SubjectName:  "Math"
       SubjectMarks:  80
       UpdatedTimeStamp:  234324324

     },
     {
     SubjectName: "History"
     SubjectMarks: 30
     UpdatedTimeStamp: 213234234
     }
]

}

我目前正在使用 Dynamodb Mapper 来保存文档。

我有以下问题

  1. 每次我更新表时,它都会在 DynamoDb 表中创建一条新记录?这是预期的吗?在查询时,我必须每次将 Limit 设置为 1 才能获取最新记录。是因为我有 SortKey 作为当前时间戳吗?如果我删除 sortKey 会有帮助吗?

  2. 我想执行以下查询: 获取所有 SubjectMarks > 60 的 StudentNames 这应该返回学生 Ben,但只有学科数学。这可能吗?我需要使用查询还是扫描?使用 GSI 会有帮助吗?在这种情况下如何使用点运算符,因为主题是一个列表?

【问题讨论】:

    标签: amazon-dynamodb dynamodb-queries amazon-dynamodb-index


    【解决方案1】:
    1. 是的,这是意料之中的,是的,这是因为您将时间戳作为排序键。请记住,分区键与主键不同。您可以说分区键和排序键的组合实际上是主键。
    2. 这是一个有点复杂的问题,有很多方法可以完成它。最终,您不能将复杂/嵌套对象用作键,这意味着您不能基于它进行查询。您可以过滤,但这并不是您真正想要做的。您在这里可能需要做的是退后一步,更好地了解 NoSQL 数据库,以及访问模式如何真正成为数据建模的关键。关于这个主题有很多很棒的论文/博客/视频。我最喜欢的视频之一是this session at re:Invent 2018

    【讨论】:

    • 学生文档只是一个例子。如何使用过滤器获取结果?
    • 过滤几乎没用...您仍然需要为读取所有记录付费,然后将不匹配过滤器的记录丢弃,只返回匹配的记录。唯一的好处是网络使用少了一点。
    • 感谢杰森和查尔斯。我可以遵循的最佳方法是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多