将JSON数组添加到DynamoDB项目

时间:2017-04-01 13:09:28

标签: node.js amazon-dynamodb

我知道我只能从原始数据类型创建“列表”,因此请将我的(使用AWS文档客户端的Node.js)代码视为伪代码。我的目标是将JSON 数组 附加到项目中,以便稍后可以从客户的记录中检索/更新/删除设备(和相应的数据)。我知道我可以使用Maps来做到这一点,但我是初学者,关于如何使用文档客户端进行操作的文档对我来说还不清楚。

这就是我想要做的事情:

var deviceData = {
    'deviceID': deviceID,
    'attributes': [
        {'firmwareVersion': firmwareVersion},
        {'productID': productID},
        {'knickName': 'New Device'},
        {'dateAdded': (new Date()).getTime()}
    ]
};

var newCustomerData = {
    TableName: process.env.customerMasterFile,
    Key: {
        'email': email
    },
    ReturnValues: 'UPDATED_NEW',
    UpdateExpression: 'ADD #device :device SET #customerEmailDomain = :customerEmailDomain, #friendlyName = :friendlyName, #created = :created, #updated = :updated',
    ExpressionAttributeNames: {
        '#device': 'deviceList',
        '#customerEmailDomain': 'customerEmaiDomain',
        '#friendlyName': 'friendlyName',
        '#created': 'createAccountTime',
        '#updated': 'updateAccountTime',
    },
    ExpressionAttributeValues: {
        ':device': docClient.createSet([deviceData]),  // I know this is incorrect...
        ':customerEmailDomain': customerEmailDomain,
        ':friendlyName': friendlyName,
        ':created': (new Date()).getTime(),
        ':updated': (new Date()).getTime()
    }
};

docClient.update(newCustomerData, function(err, data) {
    if (err) console.log(err);
    else console.log(data);
});

1 个答案:

答案 0 :(得分:2)

通常,JSON数据将在DynamoDB上保持为Map。如果在DynamoDB上存储JSON数组,它将在DynamoDB上存储为“List of Map”数据类型,这将使​​得在不知道List数据类型的索引的情况下更新,删除,检索变得困难(即设备)。如果您需要在不知道列表索引(即数组索引)的情况下完成更新/删除,建议不要使用“Map of Map”

1)更改为包括设备

在内的所有属性的SET

将单个JSON对象存储为Map,允许在不知道数组索引的情况下更新/删除: -

var params = {
    TableName: process.env.customerMasterFile,
    Key: {
        'email': email
    },
    ReturnValues: 'UPDATED_NEW',
    UpdateExpression: 'SET #device = :device, #customerEmailDomain = :customerEmailDomain ,#friendlyName = :friendlyName, #created = :created, #updated = :updated',
    ExpressionAttributeNames: {
        '#device': 'deviceList',
        '#customerEmailDomain': 'customerEmaiDomain',
        '#friendlyName': 'friendlyName',
        '#created': 'createAccountTime',
        '#updated': 'updateAccountTime',
    },
    ExpressionAttributeValues: {
        ':device': deviceData,
        ':customerEmailDomain': customerEmailDomain,
        ':friendlyName': friendlyName,
        ':created': (new Date()).getTime(),
        ':updated': (new Date()).getTime()
    }
};

样本设备为地图: -

enter image description here

替代方法: -

  • 添加device id作为表格的排序键
  • 属性emaildevice id构成DynamoDB上项目的唯一组合
  • 您可以使用此数据模型轻松完成更新/删除