Node.js 向DynamoDB项添加JSON数组

Node.js 向DynamoDB项添加JSON数组,node.js,amazon-dynamodb,Node.js,Amazon Dynamodb,我知道我只能从基本数据类型创建“列表”,所以请将我的(Node.js使用AWS Document Client)代码视为伪代码。我的目标是将一个JSON数组附加到一个项目上,以便以后可以从客户记录中检索/更新/删除设备(以及相应的数据)。我知道我可以使用Maps来实现这一点,但我是一名初学者,关于如何使用document client实现这一点的文档对我来说并不清楚 这就是我想做的: var deviceData = { 'deviceID': deviceID, 'attrib

我知道我只能从基本数据类型创建“列表”,所以请将我的(Node.js使用AWS Document Client)代码视为伪代码。我的目标是将一个JSON数组附加到一个项目上,以便以后可以从客户记录中检索/更新/删除设备(以及相应的数据)。我知道我可以使用Maps来实现这一点,但我是一名初学者,关于如何使用document client实现这一点的文档对我来说并不清楚

这就是我想做的:

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);
});

通常,JSON数据将作为映射在DynamoDB上持久化。如果您将JSON数组存储在DynamoDB上,它将存储为DynamoDB上的“地图列表”数据类型,这将使得在不知道列表数据类型(即设备)索引的情况下难以更新、删除和检索。如果需要在不知道列表索引(即数组索引)的情况下完成更新/删除,建议不要使用“映射列表”

1) 更改为设置所有属性,包括设备

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

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()
    }
};
样本设备如图所示:-

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()
    }
};

替代方法:-

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()
    }
};
  • 添加
    设备id
    作为表的排序键
  • 属性
    电子邮件
    设备id
    构成DynamoDB上项目的唯一组合
  • 使用此数据模型可以轻松完成更新/删除

通常情况下,JSON数据将作为映射保存在DynamoDB上。如果您将JSON数组存储在DynamoDB上,它将存储为DynamoDB上的“地图列表”数据类型,这将使得在不知道列表数据类型(即设备)索引的情况下难以更新、删除和检索。如果需要在不知道列表索引(即数组索引)的情况下完成更新/删除,建议不要使用“映射列表”

1) 更改为设置所有属性,包括设备

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

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()
    }
};
样本设备如图所示:-

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()
    }
};

替代方法:-

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()
    }
};
  • 添加
    设备id
    作为表的排序键
  • 属性
    电子邮件
    设备id
    构成DynamoDB上项目的唯一组合
  • 使用此数据模型可以轻松完成更新/删除

感谢您周到的回复。据我所知,用主键添加到表中的排序键创建了一种复合标识符。在我们的数据库中,可能没有为帐户分配设备(因此没有设备ID)。然后,我是否会尝试在deviceID中存储一个“null”对象,例如,用户1)在没有连接设备的情况下创建帐户,或2)修改/更新/删除,以便从用户帐户中删除所有连接的设备?不,这是不可能的。排序键对于一个项目来说是必须的。我认为排序键值相对于表的其余部分可能是非唯一的(在项目中是唯一的)。我想我可能会在一个虚拟对象中进行编写,这样我就可以通过{'email':email,'deviceID':'dummy'}对轻松/快速地获取项目。或者,有没有我忽略的更简单/更好/更容易的方法?是的,这应该很好。但是一旦创建了项,就不能更新排序键值。当在没有设备的情况下创建帐户时,用户将拥有一个带有虚拟设备对象项的项。连接设备后,您可能需要为电子邮件和设备id创建一个新项目。希望可以。不,您可以创建。分区键和排序键的组合应该是唯一的。您可以有多个具有相同电子邮件id且具有不同设备id(包括虚拟id)的项目。感谢您深思熟虑的回复。据我所知,用主键添加到表中的排序键创建了一种复合标识符。在我们的数据库中,可能没有为帐户分配设备(因此没有设备ID)。然后,我是否会尝试在deviceID中存储一个“null”对象,例如,用户1)在没有连接设备的情况下创建帐户,或2)修改/更新/删除,以便从用户帐户中删除所有连接的设备?不,这是不可能的。排序键对于一个项目来说是必须的。我认为排序键值相对于表的其余部分可能是非唯一的(在项目中是唯一的)。我想我可能会在一个虚拟对象中进行编写,这样我就可以通过{'email':email,'deviceID':'dummy'}对轻松/快速地获取项目。或者,有没有我忽略的更简单/更好/更容易的方法?是的,这应该很好。但是一旦创建了项,就不能更新排序键值。当在没有设备的情况下创建帐户时,用户将拥有一个带有虚拟设备对象项的项。连接设备后,您可能需要为电子邮件和设备id创建一个新项目。希望可以。不,您可以创建。分区键和排序键的组合应该是唯一的。您可以有多个具有相同电子邮件id且具有不同设备id(包括虚拟id)的项目。