如何在BatchGetItem

时间:2019-05-07 11:31:04

标签: amazon-dynamodb aws-appsync

我正在使用BatchGetItem从dynamodb获取多个项目。但是我需要根据某些条件过滤项目。

例如:我有一个具有ID和状态的任务表。我需要获取id 1,2,3的项目,其中status = done。

#set($ids = [1,2,3])
{    
    "operation" : "BatchGetItem",
    "tables" : {
        "userTable": {
            "keys": $util.toJson($ids)
        }
    }
}

1 个答案:

答案 0 :(得分:0)

BatchGetItem中不支持过滤器表达式。将BatchGetItem视为GetItem操作的批处理版本。 GetItem仅支持根据项目的主键检索项目。

在您的示例中,如果status列不是主键的一部分,那么BatchGetItemGetItem将对您不起作用。

示例中提供的任务表以 id 作为分区键,以 status 作为常规列,您可以通过多种方式来获得相同的结果,具体取决于您的桌子和您希望退回的物品数。

使用BatchGetItem过滤代码中的项目

如果输入项的数量相对较少,则可以只使用BatchGetItem,然后在代码中(在VTL中)过滤掉status!=done中的那些项。

优点:您无需更改表架构或添加索引

缺点:您将为在过滤之前检索项目所需的所有读取容量单位付费。由于您的API将下载可能不必要的项目,因此也会产生延迟费用。

在IN表达式中使用Scan

如果表很小,则可以扫描整个表并提供IN过滤器表达式。

优点:您无需更改表架构或添加索引

缺点:您将不得不扫描整个表,这对于大型表而言将是缓慢且昂贵的事情。

如果您不想更改表键架构,则这些建议有效。