[英]How to fetch specific attribute value from DynamoDB getItem in Java
[英]How to apply filters in dynamodb getItem
我想通过使用table.getItem(xxx)
从dynamoDB
获取特定项目,并且在获取项目时需要应用一些过滤器。
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);
在上面的代码中,我想再应用一个过滤器,例如“isAdminU=true”,请给我一些建议以在 getItem(....) 中添加过滤器。
笔记:
我可以通过使用 table.query(spec) 来解决我的使用问题,但是这种方法返回 collections 我必须每次都解析并获取第一项,这在我的情况下不需要。
如您所见,DynamoDB 的GetItem
操作不接受过滤器。 如果存在,它总是返回单个项目,因此通常不需要这种过滤。 但是,如果您确实想要这样的过滤 - 例如,您的项目很大,并且如果它们没有通过您的过滤器,您不想浪费网络带宽发送它们 - 正如您自己建议的那样,您可以使用Query
。
是的, Query
的响应格式与GetItem
略有不同,但任何语言的任何 DynamoDB 库都可以使获取响应中的第一个(也是唯一一个)项目变得微不足道。 如果您担心获得比第一个项目更多的可能性,您始终可以设置Limit=1
但如果您的关键条件确保只有一个项目将匹配,则这不是必需的。
您应该知道,无论您是在客户端执行无条件GetItem
和过滤,还是在服务器端使用过滤器执行Query
,在这两种情况下,读取成本都将是相同的,因为两者都将从磁盘读取整个项目案例。 唯一的 - 小的 - 差异可能在于网络带宽成本,并且只有在项目很大时才会变得相关。
您不能在 DynamoDB 中的 GetItem API 调用中指定过滤器。
它只支持投影,例如:
GetItemSpec spec = new GetItemSpec()
.withPrimaryKey("Id", 206)
.withProjectionExpression("Id, Title, RelatedItems[0], Reviews.FiveStar")
.withConsistentRead(true);
但是有一个QuerySpec API,可以用来获取DynamoDB中带有过滤条件的item。
Table table = dynamoDB.getTable("test");
QuerySpec spec = new QuerySpec()
.withKeyConditionExpression("apartId = :v_id")
.withFilterExpression("apartName = :apartName")
.withValueMap(new ValueMap()
.withString(":v_id", "123")
.withString(":apartName", "somewhere")
);
ItemCollection<QueryOutcome> items = table.query(spec);
Iterator<Item> iterator = items.iterator();
Item item = null;
while (iterator.hasNext()) {
item = iterator.next();
System.out.println(item.toJSONPretty());
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.