簡體   English   中英

查詢DynamoDB

[英]Querying DynamoDB

我有一個帶有字母數字字符串作為哈希鍵的DynamoDB表(例如“d4ed6962-3ec2-4312-a480-96ecbb48c9da”)。 我需要根據表中的另一個字段查詢表,因此我需要我的查詢來選擇所有鍵,例如我的字段x在dat x和date y之間。

我知道我需要哈希鍵上的條件和范圍鍵上的另一個條件,但是我很難編寫一個不將我的查詢綁定到特定ID的哈希鍵條件。

我以為我可以根據ID為NOT_NULL的冗余條件逃脫,但是當我使用它時,我得到錯誤:

查詢密鑰條件不受支持

以下是我正在使用的條件,任何想法如何實現這一目標?

 Condition hashKeyCondition = new Condition()
 .withComparisonOperator(ComparisonOperator.NOT_NULL.toString());

Condition rangeCondition = new Condition()
.withComparisonOperator(ComparisonOperator.BETWEEN.toString())
.withAttributeValueList(new AttributeValue().withS(dateFormatter.print(lastScanTime())), 
new AttributeValue().withS(dateFormatter.print(currentScanTime)));

Map<String, Condition> keyConditions = new HashMap<String, Condition>();
keyConditions.put("userId", hashKeyCondition);
keyConditions.put("lastAccesTime", rangeCondition);

在此先感謝大家的幫助。

在DynamoDB中,您可以獲得3個api的項目:

掃描 (靈活但昂貴),

查詢 (不太靈活:你必須指定一個哈希,但更便宜)

GetItem (由哈希和,如果你的表有一個,按范圍)

實現目標的唯一方法是:

  1. 使用掃描,速度慢或昂貴。

  2. 使用另一個表(B)作為前一個表(A)的索引,如:

    B.HASH ='VALUES'B .RANGE =用戶ID
    B.lastAccesTime = lastAccesTime(帶有二級索引)

現在,您必須在寫入時維護該索引,但您可以將其與Query操作一起使用,以獲取您的userIds。 查詢B:hash ='VALUES',x和y之間的lastaccessTime,選擇userid。

希望這可以幫助。

NOT_NULL比較運算符對散列鍵條件無效。 查詢的Hash密鑰條件的唯一有效運算符是EQ。 有關更多信息,請訪問: http//docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Query.html

這意味着查詢將無法工作,至少在您的表當前構建時。 您可以使用“掃描”操作,也可以創建一個單獨的表,按日期(哈希)和用戶ID(范圍)存儲數據。

祝好運!

我最后掃描表並強制執行過濾器。

感謝大家抽出時間幫忙!

您可以添加全局二級索引,例如,日期的年份和月份,並將其作為您的哈希鍵,該索引的范圍鍵將是您的日期,然后您可以查詢某個月的任何數據范圍。 它可以幫助您避免昂貴的全面掃描。

例如

全球二級指數:
哈希鍵:month_and_year例如'2014 March'
范圍鍵:full_date

希望能幫助到你!

如果要查詢除分區鍵以外的其他查詢,則需要創建GSI。 掃描在成本和性能方面非常昂貴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM