簡體   English   中英

如何在 DynamoDB 中查詢和排序兩個單獨的排序鍵?

[英]How to query and order on two separate sort keys in DynamoDB?

GROUPS
    userID: string
    groupID: string
    lastActive: number
    birthday: number

假設我有一個名為 GROUPS 的 DynamoDB 表,它存儲具有這些屬性的項目。 該表記錄了哪些用戶加入了哪些組。 用戶可以同時在多個組中。 因此,復合主鍵最常見的是:

partition key: userID
sort key: groupID

但是,如果我想查詢特定組中的所有用戶,在特定生日范圍內,按lastActive排序,這可能嗎?如果可以,我需要創建什么索引?

我可以合成lastActiveuserID來創建合成排序鍵,如下所示:

GROUPS
    groupID: string
    lastActiveUserID: string (i.e. "20201230T09:45:59-abc123")
    birthday: number

這會產生一個不同的復合主鍵,其中分區鍵是groupID ,排序鍵是lastActiveUserID ,這將根據參與者上次活動的時間對參與者進行排序,然后是按生日過濾的二級索引?

正如所寫,不,這是不可能的。

在特定的生日范圍內

暗示sk_birthday between:start and:end

按 lastActive 排序

暗示 lastActive 作為排序鍵。

這是相互排斥的......我不能 devise 一個能夠以可用格式包含兩個值的排序鍵。

您可以使用 hash group-id鍵和lastActive作為排序鍵的全局二級索引,然后按生日進行過濾。 但是,這只會影響返回的數據,不會影響讀取的數據,也不會影響讀取該數據的成本。 此外,由於 DDB 一次只能讀取1MB 的數據,如果給定的組可能有超過 1MB 的成員,則必須在循環中重復調用它。

此外,當您的索引具有與表不同的分區(哈希)鍵時,這就是全局二級索引 (GSI)。 如果您的索引具有與表相同的分區鍵但排序鍵不同,則可以使用本地二級索引 (LSI) 來完成

但是對於任何給定的查詢,您只能使用表或給定的索引。 不能同時使用多個索引

現在說了這么多, “特定生日范圍”對你來說到底是什么意思如果有問題的范圍是一個定義的時間段,按月,按周。 也許您可以擁有一個 GSI,其中 hash 鍵是"group-id#birthday-period" ,排序鍵是lastActive

例如,“給我下個月的 GROUPA 生日”
查詢(hs =“GROUPA#NOVEMBER”)

但是,如果您想要 11 月和 12 月,則必須進行兩次查詢並自行組合和排序結果。

有效且高效地使用 DDB 意味着避免使用Scan()並避免使用您知道會丟棄大量讀取數據的filterExpressions

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM