Amazon dynamodb Dynamodb查询/扫描嵌套文档。指定GSI

Amazon dynamodb Dynamodb查询/扫描嵌套文档。指定GSI,amazon-dynamodb,dynamodb-queries,amazon-dynamodb-index,Amazon Dynamodb,Dynamodb Queries,Amazon Dynamodb Index,我有以下DynamoDb文档的结构 { "studentName"(PK): "Ben", "studendId": 123, "UpdatedTimestamp"(SortKey): 1221432432 "Subjects": [ { SubjectName: "Math" SubjectMarks: 80 UpdatedTimeStamp: 234324324 }, { Subje

我有以下DynamoDb文档的结构

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

 "studendId":  123,

 "UpdatedTimestamp"(SortKey): 1221432432

 "Subjects": [

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

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

}
我目前正在使用Dynamodb映射器保存文档

我有以下问题

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

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

  • 是的,这是预期的,是的,这是因为您将时间戳作为排序键。请记住,分区键与主键不同。可以说分区键和排序键的组合实际上是主键
  • 这是一个比较复杂的问题,有很多方法可以实现。最终,您不能将复杂/嵌套对象用作键,这意味着您不能基于它进行查询。你可以过滤,但这不是你真正想要做的。这里您可能需要做的是退一步,更好地理解NoSQL数据库,以及访问模式如何真正成为数据建模的关键。关于这个主题,有很多很棒的论文/博客/视频。我最喜欢的视频之一是

  • 学生文档只是一个示例。我如何使用过滤器来获得结果?过滤几乎是无用的…你仍然要为读取所有记录付费,然后那些与过滤器不匹配的记录被抛出,只返回匹配的记录。唯一的好处是减少网络使用。谢谢Jason和Charles。我可以遵循的最佳方法是什么?