我已在DynamoDB表中添加了索引以对结果进行排序,但它似乎没有做任何事情。在DyanmoDB仪表板中,它的大小为0,项目数为0。
表中有几百个项目,它们都有一个ID(主键)和一个创建的值。创建表时,我没有设置range属性。下图中的项目顺序正确,但通过appsync的响应不正确。
我已经在返回所有项目的查询中添加了索引,但似乎没有任何作用,有或没有索引的项目顺序都是相同的:
"version" : "2017-02-28",
"operation" : "Scan",
"index" : "id-created-index",
"limit": $util.defaultIfNull(${ctx.args.limit}, 20),
"nextToken": $util.toJson($util.defaultIfNullOrBlank($ctx.args.nextToken, null))
我想念什么?索引是否尚未建立,或者我需要做其他事情才能在查询中使用它?
更新: 索引现在显示正确的item_count,尽管它仍未对结果进行排序:
答案 0 :(得分:0)
您的基表具有id
分区键,而没有排序键。根据定义,这意味着表中的每个项目都有唯一的id
。
您的GSI具有id
的分区键和created
的排序键。数据按每个分区键中创建的属性排序。由于您的每个ID都是唯一的,因此排序键基本上什么也不做。
答案 1 :(得分:0)
对表或索引的扫描操作将以随机顺序返回结果。为了使结果来自DynamoDB,您需要运行Query操作,其中分区/哈希键是固定的,并且结果将根据sort键进行排序。但是,由于您的表/ GSI始终具有唯一的ID,因此单个分区(ID)内没有其他记录。
是的,如果您希望结果按created
进行排序,则需要在表上设置一个固定的属性作为索引的分区键。需要注意的是,索引中的所有记录都将属于一个分区,这将成为瓶颈。有几种解决方法:一种方法是查看是否存在不同的访问模式,在该模式下可以固定要查询的其他属性(即owner_id
)。如果记录数足够少,则最好在客户端进行过滤。