Jat*_*tra 9 amazon-web-services node.js express amazon-dynamodb
我的 DynamoDB 表的主键为id. 查询记录时将使用相同的 id。
现在我想插入一条带有id和作为属性的记录,当且仅当表中不存在和originalURL时,我想插入此记录。idoriginalURL
更新:-根据文档ConditionExpression: "attribute_not_exists(id) AND attribute_not_exists(originalURL)",仅在主键上下文中有效(您可以执行条件放置操作(如果指定主键不存在,则添加一个新项目),所以是否存在?没有什么区别。所以我需要一个两个条件都有效的解决方案,或者originalURL也充当关键attribute_not_exists(originalURL)
router.post('/', async function (req, res, next) {
urlId = await nanoid(8);
//const hashids = new Hashids('this is my salt')
//urlId=hashids.encode(1)
console.log('jatin', urlId);
// urlId=uuidv4();
const { longURL } = req.body
const params = {
TableName: 'url',
Item: {
"id": urlId,
"originalURL": longURL
},
UpdateExpression: "set originalURL = :y",
ConditionExpression: "attribute_not_exists(id) AND attribute_not_exists(originalURL)"
}
dynamoDb.put(params, (error, data) => {
if (error) {
console.log(error);
res.status(400).json({ error: error });
} else if (Object.keys(data).length === 0 && data.constructor === Object) {
res.status(200).json(
{
urlId,
longURL,
status: 'success'
})
}
else {
res.status(400).json({ error: 'Please try again' });
}
})
});
Run Code Online (Sandbox Code Playgroud)
截至目前,即使我尝试使用已存在的 sam 原始 URL 发送请求,它也会成功添加我不想要的记录。
对于putItemapi,您可以使用条件表达式。根据医生的说法
条件表达式
为了使条件 PutItem 操作成功,必须满足的条件。
表达式可以包含以下任意内容:
功能:attribute_exists | 属性不存在 | 属性类型 | 包含| 开始于 | 尺寸
这些函数名称区分大小写。
比较运算符:= | <> | < | > | <= | >= | 之间 | 在
逻辑运算符:AND | 或 | 不是
有关条件表达式的更多信息,请参阅 Amazon DynamoDB 开发人员指南中的条件表达式。
类型:字符串
必需: 否
PutItem 操作会覆盖具有相同键的项目(如果存在)。如果您想避免这种情况,请使用条件表达式。仅当相关项目尚未具有相同的密钥时,这才允许继续写入。
Run Code Online (Sandbox Code Playgroud)aws dynamodb put-item \ --table-name ProductCatalog \ --item file://item.json \ --condition-expression "attribute_not_exists(Id)"
| 归档时间: |
|
| 查看次数: |
15506 次 |
| 最近记录: |