如何在 BatchGetItem 中使用过滤器

Mka*_*aur 1 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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Tin*_*nou 6

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

在您的示例中,如果该status列不是主键的一部分,则BatchGetItemGetItem将不适用于您。

假设示例中的任务表将id作为分区键,将status作为常规列,则可以通过多种方法获得相同的结果,具体取决于表的大小和期望返回的项目数。

BatchGetItem与代码中的过滤项一起使用

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

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

缺点:您需要支付过滤前检索项目所需的所有读取容量单位的费用。由于您的 API 会下载潜在不必要的项目,因此还会产生延迟成本。

Scan与 IN 表达式一起使用

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

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

缺点:您必须扫描整个表,这对于大型表来说会很慢且成本高昂。

如果您不希望更改表键架构,这些建议是有效的。