未填充DyanmoDB索引,并且在Appsync查询中不起作用

时间:2019-03-06 21:29:42

标签: amazon-dynamodb aws-appsync

我已在DynamoDB表中添加了索引以对结果进行排序,但它似乎没有做任何事情。在DyanmoDB仪表板中,它的大小为0,项目数为0。

enter image description here

表中有几百个项目,它们都有一个ID(主键)和一个创建的值。创建表时,我没有设置range属性。下图中的项目顺序正确,但通过appsync的响应不正确。

enter image description here

我已经在返回所有项目的查询中添加了索引,但似乎没有任何作用,有或没有索引的项目顺序都是相同的:

"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,尽管它仍未对结果进行排序:

enter image description here

2 个答案:

答案 0 :(得分:0)

您的基表具有id分区键,而没有排序键。根据定义,这意味着表中的每个项目都有唯一的id

您的GSI具有id的分区键和created的排序键。数据按每个分区键中创建的属性排序。由于您的每个ID都是唯一的,因此排序键基本上什么也不做。

答案 1 :(得分:0)

对表或索引的扫描操作将以随机顺序返回结果。为了使结果来自DynamoDB,您需要运行Query操作,其中分区/哈希键是固定的,并且结果将根据sort键进行排序。但是,由于您的表/ GSI始终具有唯一的ID,因此单个分区(ID)内没有其他记录。

是的,如果您希望结果按created进行排序,则需要在表上设置一个固定的属性作为索引的分区键。需要注意的是,索引中的所有记录都将属于一个分区,这将成为瓶颈。有几种解决方法:一种方法是查看是否存在不同的访问模式,在该模式下可以固定要查询的其他属性(即owner_id)。如果记录数足够少,则最好在客户端进行过滤。