[英]How to put the item in DynamoDB with conditional expression that is not Primary Key
生成随机uuid
值后,我提前 go 并将其分配给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 });
新项目使用之前生成的主键uuid
插入到 Dynamodb 表中。
接下来,我想在同一个表中添加另一个项目,具有相同的“标题 101”标题:
let uuid = uuidv4();
let title = "title 101"
let item = {
uuid: uuid,
title: title
};
(这两个项目将具有相同的title
,但不同的uuid
用作表中的主键)。
因为我想确保,只有当没有其他项目具有相同的“标题 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
值的新项目。
有没有办法在不是主键的属性(字段)上使用条件表达式?
Condition Expressions
仅适用于更新/删除(不适用于创建),即如果给定主键(PartitionKey + HashKey)的项目已经存在,则检查条件表达式的结果,如果返回true则继续。 我们仍然需要传递整个主键。
我们可以尝试使用scan + filter ,但我们最终会读取整个表以找到匹配非键属性的行,这很有效,如果表很大,将花费一大笔钱。
所以,在这种情况下,最好的办法是在title
上添加一个全局二级索引并运行两个单独的查询,首先按标题查询 GSI 以确定是否存在匹配标题的记录,如果不存在则放置项目。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.