node.js - DynamoDB - 如果不存在则创建主键和属性,否则获取
问题描述
我正在使用 DynamoDB,我只想在主键不存在时创建主键和属性。
如果主键存在,我返回主键和属性。
到目前为止,如果主键不存在,我已经将其更新,但我遇到的问题是,connectionString
即使主键alexaDeviceId
已经存在,它仍在更新属性:
const str = randomize('Aa0', 6);
const params = {
TableName: "alexa-connections-table",
Key: {
"alexaDeviceId": {
S: process.env.TEST_ALEXA_DEVICE_ID
}
},
ExpressionAttributeNames: {
"#CS": "connectionString"
},
ExpressionAttributeValues: {
":connection": {
S: str
}
},
ReturnValues: "ALL_NEW",
UpdateExpression: "SET #CS = :connection"
};
try {
var result = await dynamodb.updateItem(params).promise();
console.log('Results: ' + JSON.stringify(result));
return res.status(200).send(JSON.stringify(result));
} catch (err) {
console.log(err);
return res.status(500).send({ reason: err });
}
因此,例如,当我第一次使用空的 dynamoDB 表运行 lambda 函数时:
它应该添加主键alexaDeviceId
和 6 位属性(按预期工作)
Column alexaDeviceId: AHJYGV...
Column connectionString: 5Dz2SD
当我再次运行程序时
它不应该做任何更新并返回
{"Attributes":{"connectionString":{"S":"5Dz2SD"},"alexaDeviceId":{"S":"AHJYGV..."}}
相反,它正在更新connectionString
并返回一个新值(意外结果)
{"Attributes":{"connectionString":{"S":"DxBVmH"},"alexaDeviceId":{"S":"AHJYGV..."}}
connectionString
如果alexaDeviceId
主键已经存在,如何添加不更新的条件?
编辑:___________________________________________________________________
我试过用 aputItem
代替,但我不知道正确的语法:
const str = randomize('Aa0', 6);
const params = {
TableName: "alexa-connections-table",
Item: {
"alexaDeviceId": {
S: process.env.TEST_ALEXA_DEVICE_ID
},
"connectionString": {
S: str
}
},
ExpressionAttributeValues: {
':ADI': {'S': process.env.TEST_ALEXA_DEVICE_ID}
},
ConditionExpression: 'if_not_exists(alexaDeviceId, :ADI)'
};
try {
var result = await dynamodb.putItem(params).promise();
console.log('Results: ' + JSON.stringify(result));
return res.status(200).send(JSON.stringify(result));
} catch (err) {
console.log(err);
return res.status(500).send({ reason: err });
}
给我错误:
ValidationException: Invalid ConditionExpression: The function is not allowed in a condition expression; function: if_not_exists
解决方案
我使用.putItem()
而不是.updateItem()
和ConditionExpression:
ConditionExpression: 'attribute_not_exists(#ADI)'
const str = randomize('Aa0', 6);
const params = {
TableName: "alexa-connections-table",
Item: {
"alexaDeviceId": {
S: process.env.TEST_ALEXA_DEVICE_ID
},
"connectionString": {
S: str
}
},
ExpressionAttributeNames: {
"#ADI": "alexaDeviceId"
},
ConditionExpression: 'attribute_not_exists(#ADI)'
};
try {
var result = await dynamodb.putItem(params).promise();
console.log('Results: ' + JSON.stringify(result));
return res.status(200).send(JSON.stringify(result));
} catch (err) {
console.log(err);
return res.status(500).send({ reason: err });
}
connectionString
如果该表中不存在主键,这将创建一个具有该属性的新项目。
console.log('Results: ' + JSON.stringify(result));
返回一个ConditionalCheckFailedException
ConditionalCheckFailedException: The conditional request failed
如果特定的主键已经存在。
{}
如果不存在则返回(表示.putItem()
成功)。
推荐阅读
- android - 我如何使用 CameraKit 保存视频
- python - 在 tf.session() 中更改张量的值
- javascript - 使用带有 IntersectionObserver 的纯 javascript 在向下/向上滚动时隐藏/显示标题
- safari - Nuxt 内容安全策略 Safari 拒绝执行脚本
- sql - 如何检查一个单元格是否包含 MS Access 中另一个单元格的值?
- icalendar - 如何使用 .ics 文件在 macbook 日历上导入/删除事件
- kubernetes - 什么是 Kubernetes 复制控制器?
- java - 如何强制 lamda 定义的新实例化
- python - 使用base64获取二进制进出JSON
- android - 启动时注册隐式广播接收器已完成(Android Oreo 及更高版本)