DynamoDB& NodeJS:来自JSON数组的搜索表

时间:2017-07-18 14:52:57

标签: json node.js amazon-dynamodb

我有一个只有两列“EmailId”和“SubscriptionId”的DynamoDB表。 “EmailId”是主要排序键,“SubscriptionId”是主分区键。我必须在其中插入一条记录,但在此之前我需要确保该记录不存在。我从JSON数组格式的第三方API端点获取记录。因此,我将不得不在表格中进行搜索,并且必须插入遗嘱中不存在的记录。

我得到的记录采用以下格式。这是一个示例响应,我可以在阵列中获得1000条记录。

[{
    "emailId": "abc1@abc1.com",
    "subscriptionId": "A1"
}, {
    "emailId": "abc2@abc2.com",
    "subscriptionId": "A2"
}, {
    "emailId": "abc3@abc3.com",
    "subscriptionId": "A3"
}]

我不想从上面的数组中选择每条记录,搜索表格,如果没有找到,请插入它,因为这个表格会变得很大。有没有其他方法可以做到这一点?我在NodeJS上使用它。虽然我无法更改JSON数组,但我可以对DynamoDB表进行更改。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

batchWrite 项目API可用于将多个项目放入批处理中。批次中的最大请求数 25

最好的部分是,如果PutRequest中的密钥已经存在于表中,它会更新项目而不是抛出一些错误或异常(即密钥不是唯一的)。

此方法的缺点是最新更新将覆盖表中现有项的所有属性。例如,如果表中的现有项具有5个属性,而最新更新只有3个属性,则在最新批处理执行后,该表将只有3个属性(如最新的PutRequest中所示)。

var docClient = new AWS.DynamoDB.DocumentClient();    

var params = {
    RequestItems: {
        "subscription": [
            {
                PutRequest: {
                    Item: {
                        "emailId": "abc1@abc1.com",
                        "subscriptionId": "A1"
                    }
                }
            },
            {
                PutRequest: {
                    Item: {
                        "emailId": "abc2@abc2.com",
                        "subscriptionId": "A2"
                    }
                }
            },
            {
                PutRequest: {
                    Item: {
                        "emailId": "abc3@abc3.com",
                        "subscriptionId": "A3"
                    }
                }
            }
        ]
    }
};

docClient.batchWrite(params, function (err, data) {
    if (err) {
        console.error("Unable to write item. Error JSON:", JSON.stringify(err,
            null, 2));
    } else {
        console.log("Write Item succeeded:", JSON.stringify(data, null, 2));
    }
});