当前位置: 首页 > 知识库问答 >
问题:

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

赵越
2023-03-14

生成随机uuid值后,我继续将其分配给项目。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  
};

(这两个项目将具有相同的标题,但不同的uuid用作表中的主键)。

由于我想确保,只有当没有其他项目具有相同的“title 101”标题时,才会添加此项目,因此我使用条件表达式:

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('-----------------');
});

但是不管这里使用的条件表达式如何,DynamoDB都会继续添加一个具有相同title值的新项目。

有没有办法对不是主键的属性(字段)使用条件表达式?

共有1个答案

王云
2023-03-14

条件表达式仅适用于更新/删除(不适用于创建),即如果给定主键(分区键HashKey)的项目已经存在,则检查条件表达式的结果并在返回true时继续。我们仍然需要传递整个主键。

我们可以尝试使用扫描过滤器,但我们最终会读取整个表,以找到与非键属性匹配的行,这是非常有效的,如果表很大,则会花费大量资金。

所以,在这种情况下,最好是在标题上添加一个全局二级索引,并运行两个单独的查询,首先按标题查询GSI,以确定是否存在具有匹配标题的记录,如果不存在,则放置项。

 类似资料:
  • 我正在我们的项目中实施DynamoDB。我们必须将大型数据字符串放入数据库中,所以我们将数据拆分为小块,并插入多行,其中只有一个属性值发生了更改—这是字符串的一部分。一列(范围键)包含多个零件。插入和选择数据对于大小字符串都非常有效。问题是删除项目。我了解到,当您想要删除某个项时,需要为该项指定主键(哈希键或哈希键和范围键-取决于表)。但如果我想删除对其中一个属性具有特定值的项目,该怎么办?我是否

  • 我想在某些情况下更新一个项目,然后我想知道更新项目返回时项目是否更新。 留档对我来说似乎自相矛盾。 在本页上:http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateItem.html在“条件更新”示例中,它表示“更新后显示的所有项目属性都将在响应中返回。” 在本页上:https://godoc.org/git

  • 问题内容: 因此,例如: 但这当然是行不通的:)有什么办法可以做到这一点? 问题答案: 更新资料 根据一些评论,请务必注意,如果可能存在恶意内容(例如,变量来自用户输入),则可能需要转义该 变量 ES6更新 在2019年,这通常使用模板字符串编写,并且上面的代码已更新。最初的答案是:

  • 我是javascript和Node.js的新手,想知道是否有人能帮我弄清楚通过他们的Node.js SDK将新项放到AWS Dynamodb上现有表中的语法。这是我目前掌握的情况。我想做的事情有没有一个例子?如果有人能给我指明正确的方向,我将不胜感激。

  • New in Django 1.8. 条件表达式允许你在过滤器、注解、聚合和更新操作中使用 if ... elif ... else的逻辑。条件表达式为表中的每一行计算一系列的条件,并且返回匹配到的结果表达式。条件表达式也可以像其它 表达式一样混合和嵌套。 条件表达式类 我们会在后面的例子中使用下面的模型: from django.db import models class Client(m

  • 问题内容: 我有一个DynamoDB属性,其值是从数字到字符串的映射。我试图放入一个新的键值对。从我阅读的内容来看,这似乎是可能的,但我不知道如何。 但我不认为该示例是在地图上添加新项目。有人可以告诉我如何在地图上放置物品吗? 谢谢。 编辑: 我不想获取该项目,在本地进行更改,然后放回原处。我正在与可能同时进行交互的多个客户端一起工作(并且我认为dynamo进行的更新可确保不会出现竞争状况)。 问