我正在使用BatchGetItem从dynamodb获取多个项目。但是我需要根据某些条件过滤项目。
例如:我有一个具有ID和状态的任务表。我需要获取id 1,2,3的项目,其中status = done。
#set($ids = [1,2,3])
{
"operation" : "BatchGetItem",
"tables" : {
"userTable": {
"keys": $util.toJson($ids)
}
}
}
答案 0 :(得分:0)
BatchGetItem
中不支持过滤器表达式。将BatchGetItem
视为GetItem
操作的批处理版本。 GetItem
仅支持根据项目的主键检索项目。
在您的示例中,如果status
列不是主键的一部分,那么BatchGetItem
或GetItem
将对您不起作用。
示例中提供的任务表以 id 作为分区键,以 status 作为常规列,您可以通过多种方式来获得相同的结果,具体取决于您的桌子和您希望退回的物品数。
BatchGetItem
过滤代码中的项目如果输入项的数量相对较少,则可以只使用BatchGetItem
,然后在代码中(在VTL中)过滤掉status!=done
中的那些项。
优点:您无需更改表架构或添加索引
缺点:您将为在过滤之前检索项目所需的所有读取容量单位付费。由于您的API将下载可能不必要的项目,因此也会产生延迟费用。
Scan
如果表很小,则可以扫描整个表并提供IN过滤器表达式。
优点:您无需更改表架构或添加索引
缺点:您将不得不扫描整个表,这对于大型表而言将是缓慢且昂贵的事情。
如果您不想更改表键架构,则这些建议有效。