【发布时间】:2021-01-26 01:43:20
【问题描述】:
生成一个随机的uuid 值后,我继续将其分配给item.uuid:
let uuid = uuidv4();
let title = "Title 100"
let item = {
uuid: uuid,
title: title
};
对于主键为 item.uuid 属性的 Dynamodb 表,我将项目添加到表中:
let TABLE_NAME = "My Table Name";
let options = {};
let promise = dbClient.put_item({ Item: item, TableName: TABLE_NAME, ...options });
新项目被插入到 Dynamodb 表中,主键 uuid 之前生成。
接下来,我想在同一个表中添加另一个项目,具有相同的“title 101”标题:
let uuid = uuidv4();
let title = "title 101"
let item = {
uuid: uuid,
title: title
};
(这两个项目将具有相同的title,但不同的uuid 用作表中的主键)。
由于我想确定,只有在没有其他项目具有相同的“title 101”标题时才会添加此项目,我使用ConditionExpression:
let options = {
ConditionExpression: "#title <> :title",
ExpressionAttributeNames: {
"#title": "title"
},
ExpressionAttributeValues: {
":title" : "title 101"
}
}
let promise = dbClient.put_item({ Item: item, TableName: TABLE_NAME, ...options });
promise
.then(res => {
console.log('--------- SUCCESS --------');
console.log(res);
console.log('-----------------');
});
但不管这里使用的是什么ConditionExpression,DynamoDB 都会继续添加一个具有相同title 值的新项目。
有没有办法在不是主键的属性(字段)上使用条件表达式?
【问题讨论】:
-
在我看来,
title需要独一无二。为什么不将其作为主键并将 UUID 添加为非键属性。如果严格需要通过 UUID 查找,请在 UUID 上添加 GSI。然后你可以使用attribute_not_exists(#title)来保证你不会覆盖标题。
标签: javascript python typescript amazon-web-services amazon-dynamodb