2017-07-18 62 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)); 
    } 
});