2017-03-08 399 views
1

我是AWS DynamoDB的新手,需要此處專家的指導。DynamoDB:查詢所有數據並按日期降序排序

我正在創建一個應用程序,該應用程序將顯示事件列表,其中事件日期必須大於今天的日期,並按事件日期降序排列。我的表架構如下圖所示:

分區鍵=事件ID

排序鍵= EVENTDATE

如果我使用關係型數據庫,我可以使用 「SELECT * FROM事件,其中EVENTDATE> todaydate ORDERBY EVENTDATE DESC」,但如何我想通過AWS DynamoDB實現這一目標?我正在使用QUERY而不是SCAN。

+0

讓我們討論上[聊天室](HTTP相同:/ /chat.stackoverflow.com/rooms/138204/chat-between-tj-and-thearrow) – LuFFy

回答

-1

不幸的是,您無法使用Query API實現上述用例。

原因: -

  • 你需要比比較操作的更大。可以在FilterExpression或使用KeyConditionExpression的排序鍵屬性上使用不等式比較運算符。

  • 在上述用例中,您沒有eventId,因此您不能使用 KeyConditionExpression。即使使用eventDate作爲散列鍵創建GSI,也不能在散列鍵上使用不等式運算符,並且對於除排序鍵之外的任何屬性都不能排序。因此,使用GSI選項無法達到分揀要求。

解決方法解決方案中使用查詢API上面使用案例: -

  • 與哈希鍵創建GSI作爲eventDate

  • 使用查詢API由eventDate查詢索引

  • 在客戶端按eventDate排序數據。大多數編程語言都有很好的排序API。您可以輕鬆地在客戶端實現這個

注: -

  • 你不能同時實現排序和使用查詢API的要求特別是在不知道主表的哈希鍵
+0

Tq爲您的回覆先生。這意味着我沒有解決方法來達到我在上述問題中提到的效果? –

+0

@notionquest,請注意使用查詢API,您可以使用ScanIndexForward參數按排序鍵以正向或反向順序獲取結果。 – LuFFy

+0

@LuFFy這裏的用例沒有散列鍵值。 OP想要使用查詢API而沒有散列鍵值。這就是爲什麼我建議使用帶有散列鍵的GSI作爲eventDate。 – notionquest

-1

根據DynamoDB Query API Documentation

查詢:

查詢操作使用表或次要索引 直接訪問從該表或索引項的主鍵。

使用KeyConditionExpression參數爲分區鍵提供特定值 。查詢操作將使用該分區鍵值從表或索引中返回所有 項目。您可以通過在KeyConditionExpression中指定 排序鍵值和比較運算符來可選地縮小查詢操作的範圍。 可以使用ScanIndexForward參數按排序鍵以 或相反順序獲得結果。

KeyConditionExpression

,用於指定項是在由查詢動作檢索 密鑰值(一個或多個)條件。

該條件必須對單個分區鍵 的值執行相等性測試。該條件還可以對單個排序鍵值執行幾個比較測試 中的一個。查詢可以使用KeyConditionExpression來 檢索具有給定分區鍵值和排序鍵值的一個項目, 或幾個具有相同分區鍵值但不同 排序鍵值的項目。

分區鍵相等測試是必需的,而且必須在 以下格式指定:

partitionKeyName = :partitionkeyval

如果您也想爲排序鍵的條件,則必須使用是 合併以及排序鍵的條件。以下是 一個例子,使用=比較運算符排序鍵:

partitionKeyName = :partitionkeyval AND sortKeyName = :sortkeyval

有效的比較用於排序關鍵條件如下:

  • sortKeyName = :sortkeyval - 如果排序鍵值真等於:sortkeyval。
  • sortKeyName < :sortkeyval - 如果排序鍵值小於:sortkeyval,則爲true。
  • sortKeyName <= :sortkeyval - 如果排序關鍵字值小於或等於:sortkeyval,則返回true。
  • sortKeyName > :sortkeyval - 如果排序關鍵值大於:sortkeyval,則爲true。
  • sortKeyName >= :sortkeyval - 如果排序關鍵字值大於或等於:sortkeyval,則返回true。
  • sortKeyName BETWEEN :sortkeyval1 AND :sortkeyval2 - 如果排序關鍵字值大於或等於:sortkeyval1且小於 或等於sortkeyval2,則爲true。
  • begins_with (sortKeyName, :sortkeyval) - 如果排序鍵值以特定操作數開頭,則返回true。 (您不能使用此功能 以及Number類型的排序鍵。)

您可以選擇使用ExpressionAttributeNames參數 替換分​​區鍵的名稱和與佔位 令牌排序鍵。如果屬性名稱與DynamoDB保留字衝突 ,則可能需要此選項。例如,下面的 KeyConditionExpression參數將導致錯誤,因爲尺寸是 保留字:

Size = :myval 

爲了解決這個問題,定義一個佔位符(例如一個#S)來表示 屬性名大小。 KeyConditionExpression則如下:

#S = :myval 

對於保留字的列表,請參閱保留字亞馬遜 DynamoDB開發者指南中。

有關ExpressionAttributeNames和 ExpressionAttributeValues的更多信息,請參閱Amazon DynamoDB開發人員指南中的使用屬性名稱的佔位符 和值。

類型:String

要求:無

您的情況可以轉換爲下面的代碼:

$tableName = "genericTable"; 
$response = $dynamodb->query([ 
    'TableName' => $tableName, 
    'IndexName' => 'OrderCreationDateIndex', 
    'KeyConditionExpression' => 'partitionKeyName = :partitionkeyval AND sortKeyName = :sortkeyval', 
    'ExpressionAttributeValues' => [ 
     ':partitionkeyval' => ['S' => 'pkey'], 
     ':sortkeyval' => ['S' => 'sortkey'] 
    ], 
    'Select' => 'ALL_PROJECTED_ATTRIBUTES', 
    'ScanIndexForward' => false, 
    'ConsistentRead' => true, 
    'Limit' => 5, 
    'ReturnConsumedCapacity' => 'TOTAL' 
]); 
+0

@ zalizan-zolkipali,將創建日期轉換爲unixtime,然後按照我的答案來實現您的任務,它已經在我的最終工作和實時解決方案中。 – LuFFy

+0

@ Zalizan Zolkipali,上述解決方案不會工作,因爲eventId不是查詢的一部分。如果eventId可用,則對查詢API使用情況而言,這是一個直接的用例。 – notionquest