【发布时间】:2022-04-19 01:55:38
【问题描述】:
我的 DynamoDB 表的主键为 id。 查询记录会使用相同的id。
现在我想插入一条以id 和originalURL 作为属性的记录,当且仅当表中不存在id 和originalURL 时,我想插入这条记录。
更新:-ConditionExpression: "attribute_not_exists(id) AND attribute_not_exists(originalURL)" 仅适用于主键上下文,according to docs(您可以执行条件放置操作(如果具有指定主键的项不存在,则添加一个新项) ,所以attribute_not_exists(originalURL) 是否存在并没有什么不同。所以我需要一个同时满足条件的解决方案或 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' });
}
})
});
到目前为止,即使我尝试使用已经存在的原始 URL 发送请求,它也会成功添加我不想要的记录。
【问题讨论】:
-
那么
urlId也一样吗?在我看来,您正在生成随机的urlId? -
@Marcin 是的,我正在生成随机 urlId,任何记录的 urlId 都不相同,我的条件是仅当 urlID 说 xyz 并且原始 URL 说 google.com 不存在于表中时才添加记录从以前开始,有没有一种方法可以使条件表达式也适用于该 originalURL 属性
标签: node.js amazon-web-services express amazon-dynamodb