2017-07-18 51 views
0

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

我得到的记录格式如下。这是一个示例响应,我可以在数组中获得1000个记录。

[{ 
    "emailId": "[email protected]", 
    "subscriptionId": "A1" 
}, { 
    "emailId": "[email protected]", 
    "subscriptionId": "A2" 
}, { 
    "emailId": "[email protected]", 
    "subscriptionId": "A3" 
}] 

我不想接从阵列中的每个记录上面,在表格中搜索,如果没有找到,将其插入,因为该表是会得到巨大的。有没有其他办法可以做到这一点?我正在使用NodeJS。尽管我无法更改JSON数组,但我可以对DynamoDB表进行更改。有什么建议么?

回答

0

batchWrite item API可用于批量放置多个项目。该批次中的最大请求数量为。

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

该方法的缺点是最新的更新将覆盖表中现有项目的所有属性。例如,如果表中的现有项目有5个属性,而最新的更新只有3个属性,则表格最后一次执行后只有3个属性(如最新的PutRequest中的属性)。

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

var params = { 
    RequestItems: { 
     "subscription": [ 
      { 
       PutRequest: { 
        Item: { 
         "emailId": "[email protected]", 
         "subscriptionId": "A1" 
        } 
       } 
      }, 
      { 
       PutRequest: { 
        Item: { 
         "emailId": "[email protected]", 
         "subscriptionId": "A2" 
        } 
       } 
      }, 
      { 
       PutRequest: { 
        Item: { 
         "emailId": "[email protected]", 
         "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)); 
    } 
});