[英]Query() DynamoDB for each value in array on Lambda NodeJS
我在 NodeJS 12x Lambda 函數中有以下代碼:
targetedAliases = ["abc", "efg"]; //Not used yet. But want to replace alias with this array.
alias = "abc" //using this one aka targetedAliases[0].
const dynamoDB = new AWS.DynamoDB({
apiVersion: "2012-10-08"
});
var aliasScores;
const params = {
TableName: 'a-table',
FilterExpression: '#alias = :alias',
ExpressionAttributeNames: {
'#alias': 'alias',
},
ExpressionAttributeValues: {
':alias': {
S: alias
},
}
};
aliasScores = await dynamoDB.scan(params).promise();
console.log("====> ", aliasScores);
因為該功能是打印的內容aliasScores
如預期,但我需要執行此n
為每個項目時間targetedAliases
陣列。
有沒有辦法可以使用Array.forEach
或類似的東西來為數組中的每個項目迭代執行查詢/掃描? 或者,我可以使用FilterExpression
上的FilterExpression
來執行一次查詢/掃描嗎?
我想將每個查詢/掃描結果存儲在aliasScores
變量中,作為所有返回對象的串聯,以便在下面進一步使用它。
您可以使用Promise.all
和.map
並行執行這些並在數組中獲取結果。 像這樣的東西
const targetedAliases = ["abc", "efg"]; //Not used yet. But want to replace alias with this array.
alias = "abc" //using this one aka targetedAliases[0].
const dynamoDB = new AWS.DynamoDB({
apiVersion: "2012-10-08"
});
var aliasScores;
const result = await Promise.all(targetedAliases.map(alias => {
const params = {
TableName: 'a-table',
FilterExpression: '#alias = :alias',
ExpressionAttributeNames: {
'#alias': 'alias',
},
ExpressionAttributeValues: {
':alias': {
S: alias
},
}
};
return dynamoDB.scan(params).promise();
}));
console.log(result);
您的選項有點取決於屬性別名是否為主鍵。 只要知道這種差異就會有很大幫助。
Promise.all() 為每個別名執行一個操作。 考慮批處理方法。 在一個 API 調用中執行單個批處理,這將減少操作數量並減少您的 DynamoDB API 調用。 批處理很有趣。
當屬性鍵“別名”是主鍵時,BatchGetItem a 對於多達十幾個左右的操作是非常有效的操作,其中每個操作都是對一個別名的查詢。 只需為數組中的每個條目創建一個帶有一個操作的 BatchGetItem。 響應是單個 json 字典。
當屬性鍵“別名”不是主鍵時,情況就不同了,因為必須掃描表。 DynamoDB 掃描() 不同於 DynamoDB 查詢()。 scan 可以按任何屬性查找項目,並且可以按“別名”的值進行過濾。 FilterExpression 支持 OR 並且可以過濾掃描。 掃描將檢查每個項目,過濾器只會減少返回的結果集。 響應是單個 json 字典。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.