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