簡體   English   中英

如何避免dynamodb中的掃描操作

[英]How to avoid scan operation in dynamodb

發布表

{
...otherPostFields,
tags: string[]
}

用戶表

{
...otherUserFields,
tags: string[]
}

我正在嘗試制作提要我首先獲取用戶以獲取標簽

我不想使用scan ,因為它會遍歷表中的所有記錄,因此非常昂貴。 有更好的方法嗎?

一旦我有了用戶標簽,我就在 Post 表上使用掃描操作

      const { tags } = Items[0] as IUser & Pick<CUser, 'tags'>;

      const ExpressionAttributeValues = tags.reduce<Record<string, string>>((acc, tag, index) => {
        acc[`:tags${index}`] = tag;
        return acc;
      }, {});
      const FilterExpression = tags.reduce<string>((acc, _, index) => {
        if (index === 0) return `contains(tags, :tags${index})`;
        return `${acc} OR contains(tags, :tags${index})`;
      }, '');

      // expensive operation
      const { Items: posts } = await client
        .scan({
          TableName: PostsTable.get(),
          FilterExpression,
          Limit: 10,
          ExpressionAttributeValues,
        })
        .promise();

您沒有 state DynamoDB 表的架構,也沒有在讀取之前擁有哪些信息,因此很難幫助您。

但是,簡而言之,您沒有進行昂貴的閱讀,因為您設置了Limit=10 ,每個請求將消耗 5 個 RCU。 如果請求不頻繁(每秒少於 5 次),您仍處於 DynamoDB 的 25 RCU 免費層級內。

更新

我正在嘗試制作提要我首先獲取用戶以獲取標簽

為什么不使用Query ,因為您似乎正在嘗試獲取單個用戶標簽。

我注意到的一件事是,當表中的項目超過 100k 時,上述查詢不會返回任何文檔。 為什么會這樣?

這是因為 DynamoDB 每次 API 調用最多只返回 1MB,如果您需要超過 1MB,則必須分頁。

單個 Query 操作將讀取最大項目集數(如果使用 Limit 參數)或最大 1 MB 的數據,然后使用 FilterExpression 對結果應用任何過濾。 如果響應中存在 LastEvaluatedKey,您將需要對結果集進行分頁。 有關更多信息,請參閱 Amazon DynamoDB 開發人員指南中的對結果進行分頁。

暫無
暫無

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

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