簡體   English   中英

使用過濾器表達式從 dynamo 數據庫查詢返回固定數量的項目

[英]Return fixed number of items from dynamo db query with filter expression

我正在嘗試從 dynamo db 表中檢索固定數量的項目(讓我們暫時將其視為 5)。

這是我正在使用的代碼。

response = table.query(
                       KeyConditionExpression=Key('pk').eq('goo'),
                       Limit=5,
                       FilterExpression=Attr('goo').eq('bar'))

我只從中得到 4 件物品。 但是,如果我刪除 FilterExpression,項目計數將為 5。那么即使我使用 FilterExpression,是否還有其他方法可以獲取固定數量的項目?

從表中讀取項目應用過濾器表達式,以減少通過線路發送的記錄數。 限制在查詢操作期間應用,即在過濾器表達式之前。

如果Query讀取了 5 個項目,而其中只有 4 個與FilterExpression匹配,那么您只會返回 4 個項目。

務實的做法是從Query中刪除限制並在客戶端應用限制。 缺點是您可能需要支付更多讀取容量單位的費用。

如果你想避免這種情況,你可能不得不重新考慮你的數據模型——這里很難有通用的解決方案。


在您的特定情況下,您可以使用分區鍵pk和排序鍵goo創建一個全局二級索引(對於 GSI 而言,它不必是唯一的)。 然后,您可以使用 Limit 5 對 GSI 發出查詢,它會給您想要的。 但是:您為 GSI 存儲 + 吞吐量付費。


編輯除了 Python 代碼外,這個問題幾乎是重復的

這是我找到的答案。

paginator = dynamo_db_client.get_paginator('query')
response_iterator = paginator.paginate(
                        TableName='table_name',
                        KeyConditionExpression='#P=:p',
                        FilterExpression='#T=:t',
                        ExpressionAttributeNames={'#P':'pk','#T':'goo'},
                        ExpressionAttributeValues={
                               ':p': {'S':'goo'},
                               ':t': {'S':'bar'}
                        },
                        PaginationConfig={
                                'MaxItems':5
                        }     
                  )
  
for page in response_iterator:
    print(len(page['Items']))

分頁器文檔鏈接: DynamoDB.Paginator.Query

暫無
暫無

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

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