繁体   English   中英

如何使用不是主键的条件表达式将项目放入 DynamoDB

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM