繁体   English   中英

如何在 dynamodb getItem 中应用过滤器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM