簡體   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