簡體   English   中英

Query() DynamoDB 用於 Lambda NodeJS 上數組中的每個值

[英]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.

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