2016-02-29 40 views
2

比方說,我們有一個表item,它有一個屬性userId(分區鍵,字符串)和屬性creationTime(排序鍵,數字)。我想執行一個查詢,該查詢從時間t1到時間t2的次級索引中提取用戶的項目。Dynamodb:爲什麼主鍵不能成爲過濾器表達式的一部分?

既然不能對同一項目多個範圍的條件下,我的想法是,添加的過濾表達式限制結果:

aws dynamodb query --table-name items --index-name userId-creationTime-index --key-condition-expression "userId=:u AND creationTime<=:t1" --filter-expression "creationTime>=:t2" --expression-attribute-values '{":u":{"S":"6f3b581d-8632-4edc-a19d-b77f158d8a23"}, ":t1":{"N":"1456647476000000"}, ":t2":{"N":"1456561076000000"}}'

查詢失敗,

A client error (ValidationException) occurred when calling the Query operation: Filter Expression can only contain non-primary key attributes: Primary key attribute: creationTime

這感覺很奇怪。不過濾只是在執行查詢後限制結果?難道不可能像這樣實現像t1 <= creationDate <= t2這樣的條件嗎?

+2

找出使用BETWEEN運算符的解決方法。但是,如果任何人都可以解釋爲什麼我不能在過濾表達式中使用相同的屬性,那就太棒了! – user331244

+0

亞馬遜代表表示這是「[爲用戶的利益。](https://forums.aws.amazon.com/thread.jspa?threadID=172530)」它仍然不是很清楚爲什麼用戶限制使用關鍵條件表達式中的所有條件運算符(可在過濾器表達式中使用)。 – rob

+0

當你說二級索引是指本地二級索引?因爲在這個例子中這似乎是可能的。 http://docs.amazonaws.cn/zh_CN/amazondynamodb/latest/developerguide/LSI.html#LSI.Querying – strongjz

回答

1

DynamoDB將首先從存儲數據的主機中順序讀取您的物品頁面。上面列出的關鍵條件用於限制從存儲項目的主機讀取的數據。接下來,它將根據您提供的過濾器參數過濾從存儲主機讀取的結果。存儲主機上的實際讀取卷會產生RCU。通過將KeyConditions用於主鍵屬性和Filter表達式,可以更好地控制查詢操作的讀取成本。在查詢操作的KeyCondition條件更嚴格時,將限制讀取的項目數量,從而減少每個查詢操作中消耗的RCU。

相關問題