比方說,我們有一個表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
這樣的條件嗎?
找出使用BETWEEN運算符的解決方法。但是,如果任何人都可以解釋爲什麼我不能在過濾表達式中使用相同的屬性,那就太棒了! – user331244
亞馬遜代表表示這是「[爲用戶的利益。](https://forums.aws.amazon.com/thread.jspa?threadID=172530)」它仍然不是很清楚爲什麼用戶限制使用關鍵條件表達式中的所有條件運算符(可在過濾器表達式中使用)。 – rob
當你說二級索引是指本地二級索引?因爲在這個例子中這似乎是可能的。 http://docs.amazonaws.cn/zh_CN/amazondynamodb/latest/developerguide/LSI.html#LSI.Querying – strongjz