如何在 dynamodb getItem 中应用过滤器

Jyo*_*ony 2 java amazon-dynamodb

我想dynamoDB通过使用来获取特定项目table.getItem(xxx),并且在获取项目时需要应用一些过滤器。

select * from emp where empid=1 and isadmin=true;

如何在 dynamo-db 中编写上述查询。

下面是我尝试过的示例代码:

GetItemSpec spec = new GetItemSpec()
.withPrimaryKey("empid", "1", "deptno", "12");
 Item outcome = table.getItem(spec);
  System.out.pritnln("outcome "+outcome);
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我想再应用一个过滤器,例如“isAdminU=true”,请给我一些在 getItem(....) 中添加过滤器的建议。

笔记:

我可以通过使用 table.query(spec) 来解决我的使用问题,但是此方法返回集合,我每次都必须解析并获取第一个项目,这在我的情况下是不需要的。

Nad*_*'El 6

正如您所注意到的,DynamoDB 的GetItem操作不接受过滤器。如果存在,它总是返回单个项目,因此通常不需要进行此类过滤。但是,如果您确实想要这样的过滤 - 例如,您的项目很大,如果它们没有通过您的过滤器,您不想浪费网络带宽来发送它们 - 正如您自己建议的那样,您可以使用Query.

是的,Query的响应格式与 略有不同GetItem,但任何语言的任何 DynamoDB 库都使得获取响应中的第一个(也是唯一一个)项目变得微不足道。如果您担心可能会获得比第一项更多的项目,您可以随时进行设置,Limit=1但如果您的关键条件确保只有一个项目匹配,则没有必要这样做。

您应该知道,无论您是GetItem在客户端执行无条件过滤还是Query在服务器端执行过滤,在这两种情况下,读取成本都将相同,因为在这两种情况下都会从磁盘读取整个项目。唯一的(很小的)差异可能在于网络带宽成本,并且只有当项目很大时,这才变得相关。