[英]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 (由哈希和,如果你的表有一個,按范圍)
實現目標的唯一方法是:
使用掃描,速度慢或昂貴。
使用另一個表(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.