[英]How to avoid SCAN while filtering on a marketplace app using 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.