我有一個給定的哈希鍵(userid)和排序鍵(年齡)的dynamodb。比方說,如果我們想要將元素檢索爲「每個hashkey(userid),最小年齡」輸出,那麼查詢和過濾器表達式將用於發電機查詢。
謝謝!
我有一個給定的哈希鍵(userid)和排序鍵(年齡)的dynamodb。比方說,如果我們想要將元素檢索爲「每個hashkey(userid),最小年齡」輸出,那麼查詢和過濾器表達式將用於發電機查詢。
謝謝!
我不認爲你可以在查詢中做到這一點。你需要做全表掃描。如果你有一個哈希鍵列表,那麼你可以做N個查詢(並行)。
[更新]這是另一種可能的方法: 維護第二個表,其中只有一個散列鍵(userID)。該表將包含給定用戶的年齡最小的記錄。要做到這一點,請確保每次更新主表時,如果第二個表中的新年齡小於當前年齡,則還要更新第二個表。你可以使用條件更新。更新可以由應用程序本身完成,也可以讓AWS lambda監聽dynamoDB流。現在,如果您需要每次使用的最小年齡,您仍然對第二張表進行全表掃描,但是此掃描只會讀取相關記錄,因此它將是最佳選擇。
有兩種方法可以實現的是:
如果您不需要實時獲取這些數據您可以將數據導出到其他AWS系統,如EMR或Redshift並執行復雜的分析查詢那裏。有了這個,你可以使用連接和操作符來編寫SQL表達式。
您甚至可以對DynamoDB數據執行EMR Hive查詢,但它們執行掃描,所以它不是非常經濟高效。
另一種選擇是使用DynamoDB流。您可以維護一個單獨的表,用於存儲:
表:MinAges
用戶ID - 主鍵
MINAGE - 常規數值屬性
在每次更新/刪除/插入您可以查詢最新用戶的最低年齡並將其存儲到MinAges表
另一種選擇是寫這樣的:
storeNewAge(userId, newAge)
def smallestAge = getSmallestAgeFor(userId)
storeSmallestAge(userId, smallestAge)
但由於DynamoDB不具有本地事務的支持是很危險的運行這樣的代碼,因爲你可能有不一致的數據結束了。您可以使用DynamoDB transactions library,但這些交易are expensive。而如果您使用的是流媒體,則會以非常低的價格獲得一致的數據。
可以使用ScanIndexForward
YourEntity requestEntity = new YourEntity();
requestEntity.setHashKey(hashkey);
DynamoDBQueryExpression<YourEntity> queryExpression = new DynamoDBQueryExpression<YourEntity>()
.withHashKeyValues(requestEntity)
.withConsistentRead(false);
equeryExpression.setIndexName(IndexName); // if you are using any index
queryExpression.setScanIndexForward(false);
queryExpression.setLimit(1);
做到這一點請告訴我實現使用dynamodb這些類型的用例的最佳方式?可以說哈希鍵不存儲在某個地方。 – Santhosh
我用一種可能的方法更新了我的答案。還有其他人。 –